casting swift cgfloat

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