SwiftでCGFloatをFloatにキャストする


91

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

let myFloat : Float = myRect.origin.x

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

だから私が明示的にこのようにキャストすると:

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

しかし、これによりコンパイラエラーが発生します: '式のタイプ'フロート 'を'フロートに変換できません '

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


8
64ビットシステムでは、CGFloatをFloatにキャストすると精度が失われます。CGFloatは64ビットシステムでは64ビット、32ビットシステムでは32ビットであり、Floatは常に32ビットです。これを回避するには、Floatの代わりにDoubleを使用します。
Lukas 2014年


XcodeでCGFloatをドリルダウンし、それが定義されている場所を確認すると、32ビットアーキテクチャではフロートとして、64ビットアーキテクチャではダブルとしてtypedefされていることがわかります。
jcpennypincher 2014年

回答:


173

Float()イニシャライザを使用できます。

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

17
変数名として「float」を使用すると、やや混乱しますが、おそらく「swFloat」のようなものに変更しますか?
フェルマーのリトルスチューデント

2
「「フロート」はやや混乱しています」。マジ?
AlvinfromDiaspar 2016

2
@AlvinfromDiasparはい、おそらく他の言語がのfloat代わりに使用しているFloatため、変数名の代わりにそのタイプ/キーワードのように見えます。
Supuhstar 2017年

29

私のように怠惰な場合は、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

1
一般的な構造体の候補のように見える
μολὼν.λαβέ

@イアン私はあなたの質問を理解できません...例?
hyouuu

13

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

キーワード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

asジェネリック型を具象型にキャストするためにも使用できることに注意してください。たとえば、に準拠するジェネリック型を受け入れる関数がある場合BinaryInteger、またはをInt使用してキャストできます。as?as!
Peter Schorn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.