将CGFloat投射到Swift中

我需要存储一个值作为Float ,但源数据是一个CGFloat

 let myFloat : Float = myRect.origin.x 

但是这会导致编译器错误:'NSNumber'不是子types'Float'

所以如果我明确地这样做:

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

但这反过来导致编译器错误:'不能将expression式的types'浮动'转换为'浮动'

什么是正确的方式来做到这一点,并满足编译器吗?

您可以使用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 

通常,最好的解决scheme是保持types并使用CGFloat ,即使在Swift中也是如此。 这是因为CGFloat在32位和64位机器上具有不同的大小。

关键字只能用于dynamic投射(对于子类),例如

 class A { } class B : A { } var a: A = B() var b: B = a as B 

然而, DoubleIntFloat等不是彼此的子类,因此为了“施放”你必须创build一个新的实例,例如

 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