web-dev-qa-db-fra.com

Lancer CGFloat sur Float dans Swift

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?

86
Andrew Ebling

Vous pouvez utiliser l'initialiseur Float():

let cgFloat: CGFloat = 3.14159
let someFloat = Float(cgFloat)
163
Erik

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
27
hyouuu

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
13
Sulthan