将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
然而, Double
, Int
, Float
等不是彼此的子类,因此为了“施放”你必须创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