J'ai besoin de stocker une valeur en tant que Float
, mais les données source sont CGFloat
:
let myFloat : Float = myRect.origin.x
mais cela entraîne l'erreur du compilateur: 'NSNumber' n'est pas du sous-type 'Float'
Donc, si je le lance explicitement comme ceci:
let myFloat : Float = myRect.origin.x as Float
mais cela entraîne à son tour l'erreur du compilateur: 'Impossible de convertir le type d'expression' Float 'en' Float ''
Quelle est la bonne façon de faire cela et de satisfaire le compilateur s'il vous plaît?
Réponses:
Vous pouvez utiliser l'
Float()
initialiseur:la source
float
place deFloat
, donc cela ressemble à ce type / mot-clé au lieu d'un nom de variable.Si vous êtes aussi paresseux que moi, dans un Extensions.swift définissez ce qui suit:
Ensuite, vous pouvez faire:
la source
Habituellement, la meilleure solution est de conserver le type et l'utilisation
CGFloat
, même dans Swift. C'est parce qu'ilCGFloat
a une taille différente sur les machines 32 bits et 64 bits.Le mot-clé
as
ne peut être utilisé que pour la diffusion dynamique (pour les sous-classes), par exempleCependant,
Double
,Int
,Float
etc sont les sous - classes non de l'autre, donc « cast » vous devez créer une nouvelle instance, par exemplela source
as
pour convertir un type générique en un type concret. Par exemple, si vous aviez une fonction qui accepte un type générique conforme àBinaryInteger
, vous pouvez la convertir enInt
utilisantas?
ouas!
.