値をFloat
として保存する必要がありますが、ソースデータはCGFloat
です。
let myFloat : Float = myRect.Origin.x
しかし、これによりコンパイラエラーが発生します。「NSNumber」はサブタイプ「Float」ではありません
したがって、明示的に次のようにキャストした場合:
let myFloat : Float = myRect.Origin.x as Float
しかし、これによりコンパイラエラーが発生します。「式の型を「浮動」から「浮動」に変換できません」
これを行い、コンパイラを満足させる正しい方法は何ですか?
Float()
初期化子を使用できます:
let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
あなたが私と同じくらい怠けている場合、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
通常、最良の解決策は、Swiftでも、型を保持し、CGFloat
を使用することです。これは、32ビットと64ビットのマシンでCGFloat
のサイズが異なるためです。
キーワードas
は、(サブクラスの)動的なキャストにのみ使用できます。
class A {
}
class B : A {
}
var a: A = B()
var b: B = a as B
ただし、Double
、Int
、Float
などは互いのサブクラスではないため、「キャスト」するには、新しいインスタンスを作成する必要があります。
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