CGFloat:在Float时调用rintf(),在Double时调用rint()

时间:2014-07-16 22:14:25

标签: generics swift cgfloat

当架构是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)))
}

也许泛型可以很好地处理这两种情况?

1 个答案:

答案 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。