我需要将值存储为Float
,但源数据为CGFloat
:
let myFloat : Float = myRect.origin.x
但这导致编译器错误:'NSNumber'不属于子类型'Float'
所以,如果我明确地这样做:
let myFloat : Float = myRect.origin.x as Float
但这会导致编译器错误:'无法将表达式的'Float'转换为'Float''
这样做的正确方法是什么,请满足编译器的要求?
答案 0 :(得分:156)
您可以使用Float()
初始值设定项:
let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
答案 1 :(得分:27)
如果你像我一样懒惰,在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
答案 2 :(得分:13)
通常,最好的解决方案是保持类型并使用CGFloat
,即使在Swift中也是如此。那是因为CGFloat
在32位和64位机器上的大小不同。
关键字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