J'ai besoin de stocker une valeur en tant que Float
, mais les données source sont un CGFloat
:
let myFloat : Float = myRect.Origin.x
mais cela entraîne l'erreur de compilation: "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 de l'expression' Float 'en' Float ''
Quelle est la bonne façon de faire cela et de satisfaire le compilateur s'il vous plaît?
Vous pouvez utiliser l'initialiseur Float()
:
let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
Si vous êtes aussi paresseux que moi, définissez les éléments suivants dans une extension.
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) }
}
Ensuite, vous pouvez faire:
var someCGFloatFromFloat = 1.3.f
var someCGFloatFromInt = 2.f
var someFloatFromCGFloat = someCGFloatFromFloat.swf
Habituellement, la meilleure solution consiste à conserver le type et à utiliser CGFloat
, même dans Swift. C'est parce que CGFloat
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 exemple.
class A {
}
class B : A {
}
var a: A = B()
var b: B = a as B
Cependant, Double
, Int
, Float
etc ne sont pas des sous-classes les unes des autres. Par conséquent, pour "transtyper", vous devez créer une nouvelle instance, par exemple.
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