Necesito almacenar un valor como Float
, pero los datos de origen son 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?
Respuestas:
Puedes usar el
Float()
inicializador:fuente
float
lugar deFloat
, por lo que parece ese tipo / palabra clave en lugar de un nombre de variable.Si eres tan vago como yo, en un Extensions.swift defina lo siguiente:
Entonces puedes hacer:
fuente
Por lo general, la mejor solución es mantener el tipo y el uso
CGFloat
, incluso en Swift. Eso es porqueCGFloat
tiene un tamaño diferente en máquinas de 32 bits y 64 bits.La palabra clave solo
as
se puede utilizar para la conversión dinámica (para subclases), por ejemploSin embargo,
Double
,Int
,Float
etc no son subclases de uno al otro, por lo tanto, a "fundido" tiene que crear una nueva instancia, por ejemplo,fuente
as
para convertir un tipo genérico en un tipo concreto. Por ejemplo, si tenía una función que acepta un tipo genérico que se ajusta aBinaryInteger
, puede convertirlo enInt
usandoas?
oas!
.