casting - Lanzar CGFloat para flotar en Swift
(3)
Por lo general, la mejor solución es mantener el tipo y usar CGFloat
, incluso en Swift. Eso es porque CGFloat
tiene un tamaño diferente en las máquinas de 32 bits y 64 bits.
Palabra clave as
se puede usar solo para fundición dinámica (para subclases), por ej.
class A {
}
class B : A {
}
var a: A = B()
var b: B = a as B
Sin embargo, Double
, Int
, Float
, etc. no son subclases entre sí, por lo tanto, para "emitir" debe crear una nueva instancia, por ejemplo
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
Necesito almacenar un valor como Float
, pero la fuente de datos es un CGFloat
:
let myFloat : Float = myRect.origin.x
pero esto da como resultado el error del compilador: ''NSNumber'' no es del subtipo ''Float''
Entonces, si lo lanzo explícitamente así:
let myFloat : Float = myRect.origin.x as Float
pero esto a su vez da como resultado el error del compilador: ''No se puede convertir el tipo de expresión'' Float ''a'' Float ''''
¿Cuál es la forma correcta de hacer esto y satisfacer al compilador, por favor?
Puede usar el inicializador Float()
:
let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
Si eres tan vago como yo, en Extensions.swift define lo siguiente:
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) }
}
Entonces puedes hacer:
var someCGFloatFromFloat = 1.3.f
var someCGFloatFromInt = 2.f
var someFloatFromCGFloat = someCGFloatFromFloat.swf