web-dev-qa-db-ja.com

SwiftでのCGFloatからFloatへのキャスト

値をFloatとして保存する必要がありますが、ソースデータはCGFloatです。

let myFloat : Float = myRect.Origin.x

しかし、これによりコンパイラエラーが発生します。「NSNumber」はサブタイプ「Float」ではありません

したがって、明示的に次のようにキャストした場合:

let myFloat : Float = myRect.Origin.x as Float

しかし、これによりコンパイラエラーが発生します。「式の型を「浮動」から「浮動」に変換できません」

これを行い、コンパイラを満足させる正しい方法は何ですか?

86
Andrew Ebling

Float()初期化子を使用できます:

let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
163
Erik

あなたが私と同じくらい怠けている場合、Extensions.Swiftで以下を定義します。

extension Int {
  var f: CGFloat { return CGFloat(self) }
}

extension Float {
  var f: CGFloat { return CGFloat(self) }
}

extension Double {
  var f: CGFloat { return CGFloat(self) }
}

extension CGFloat {
  var swf: Float { return Float(self) }
}

その後、次のことができます。

var someCGFloatFromFloat = 1.3.f
var someCGFloatFromInt = 2.f
var someFloatFromCGFloat = someCGFloatFromFloat.swf
27
hyouuu

通常、最良の解決策は、Swiftでも、型を保持し、CGFloatを使用することです。これは、32ビットと64ビットのマシンでCGFloatのサイズが異なるためです。

キーワードasは、(サブクラスの)動的なキャストにのみ使用できます。

class A {
}

class B : A {
}

var a: A = B()
var b: B = a as B

ただし、DoubleIntFloatなどは互いのサブクラスではないため、「キャスト」するには、新しいインスタンスを作成する必要があります。

var d: Double = 2.0
var f: Float = Float(d) //this is an initialiser call, not a cast
var i: Int = Int(d) //this is an initialiser call, not a cast
13
Sulthan