【发布时间】:2017-03-23 07:46:57
【问题描述】:
Xcode 8.2.1、Swift 3。
import UIKit
extension Double {
/// Linear interpolation.
/// Converts a number in one range to its equivalent in another range.
func interpolate(from: ClosedRange<Int>, to: ClosedRange<Int>) -> Double {
let oldValue = self
let offset = Double(to.lowerBound - from.lowerBound)
let expansion = Double(to.upperBound - to.lowerBound) / Double(from.upperBound - from.lowerBound)
print("\nvalue", oldValue)
print("Sign", self.sign)
print("offset", offset)
print("expansion", expansion)
print("oldLowerbound", Double(from.lowerBound))
let newValue = (oldValue - Double(from.lowerBound)) * expansion + offset
return newValue
}
}
print( 1.0.interpolate(from: 0...10, to: 50...70)) // Prints 52.0. Correct
print(-1.0.interpolate(from: 0...10, to: 50...70)) // Prints -52.0. Expected 48.0.
print((-1.0).interpolate(from: 0...10, to: 50...70)) // Prints 48. Correct.
当单元测试在最(看似)微不足道的代码中发现意外问题时,它们会为自己付出代价:
(上面的代码将在 iOS Playground 中运行。)
有没有办法扩展Double以使第二个打印语句按预期工作(而不像第三个打印语句那样使用括号)?
【问题讨论】:
标签: swift function swift3 xcode8