3

当架构是 32 位时,CGFloat 是浮点数。在这种情况下,我想调用rintf()

当架构为 64 位时,CGFloat 为 Double。在这种情况下,我想调用rint()

我目前对 Double 进行强制转换,然后调用rint()

func roundToNearestCell(coordinate: CGFloat) -> CGFloat {
    let cellSize = 10.0
    return cellSize * CGFloat(rint(Double(coordinate / cellSize)))
}

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

4

1 回答 1

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。

于 2014-07-16T23:41:51.070 回答