Ответ 1
Вы можете использовать инициализатор Float()
:
let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
Мне нужно сохранить значение как Float
, но исходными данными являются CGFloat
:
let myFloat : Float = myRect.origin.x
но это приводит к ошибке компилятора: "NSNumber" не относится к подтипу "Float"
Итак, если я явно использую его следующим образом:
let myFloat : Float = myRect.origin.x as Float
но это, в свою очередь, приводит к ошибке компилятора: "Невозможно преобразовать тип выражения" Float "в" 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
Обычно лучшим решением является сохранение типа и использование CGFloat
, даже в Swift. Это потому, что CGFloat
имеет разный размер на 32-битных и 64-битных машинах.
Ключевое слово as
может использоваться только для динамического каста (для подклассов), например
class A {
}
class B : A {
}
var a: A = B()
var b: B = a as B
Однако Double
, Int
, Float
и т.д. не являются подклассами друг друга, поэтому для "cast" вам нужно создать новый экземпляр, например
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