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