3

アーキテクチャが 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)))
}

おそらく、ジェネリックは両方のケースをうまく処理できますか?

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 に答える