当架构是32位时,CGFloat是Float。
在这种情况下,我想调用rintf()
当架构为64位时,CGFloat为Double。
在这种情况下,我想调用rint()
我目前正在对Double进行强制转换,然后调用rint()
func roundToNearestCell(coordinate: CGFloat) -> CGFloat {
let cellSize = 10.0
return cellSize * CGFloat(rint(Double(coordinate / cellSize)))
}
也许泛型可以很好地处理这两种情况?
答案 0 :(得分:2)
虽然必须打开参数类型并提供默认情况,但这是有效的。
func round<T: FloatingPointNumber>(value: T) -> T {
switch value {
case let value as Float:
return rintf(value) as T
case let value as Double:
return rint(value) as T
default:
return 0.0 as T
}
}
当你需要根据传入的项目类型采取不同的操作时,我不认为泛型可以正常工作。在这种情况下,我会使用扩展并让多态做它的事情:
protocol Roundable {
typealias NumberType
func Round() -> NumberType
}
extension Float: Roundable {
func Round() -> Float {
return rintf(self)
}
}
extension Double: Roundable {
func Round() -> Double {
return rint(self)
}
}
协议定义是可选的,但似乎是Swiftian。