web-dev-qa-db-fra.com

Swift prend-il en charge la conversion implicite?

Par exemple, j'ai le code suivant:

    let numberOfBlocks = 3
    let blockWidth = SKSpriteNode(imageNamed: "image.png").size.width
    let padding = 20.0

    let offsetX : Float = (self.frame.size.width - (blockWidth * numberOfBlocks + padding * (numberOfBlocks-1))) / 2

J'ai eu l'erreur:

'Double' n'est pas convertible en 'UInt8'

Existe-t-il un moyen de convertir implicitement le type de données (peut-être uniquement pour le type de données primitif)?

Modifier:

Je sais comment faire la conversion explicite en utilisant un constructeur de type particulier comme Iducool suggéré. Mais cela n'aide pas beaucoup ma question car nous ne savons même pas où ajouter les conversions. J'ai simplifié mon expression dans la cour de récréation:

enter image description here

Le problème est dans la variable "padding", le message d'erreur est

'Double' n'est pas convertible en 'UInt8'.

J'ai donc fait la conversion:

enter image description here

Le problème est alors dans la variable "blockWidth" maintenant.

J'ai ajouté à nouveau la conversion:

enter image description here

Et le message d'erreur est:

Le type 'UInt8' n'est pas conforme au protocole 'FloatLiteralCovertible'

La dernière expression de travail est:

enter image description here

Est-ce simple et rapide? Je ne pense pas.

29
Bagusflyer

Il n'y a pas de distribution implicite dans Swift.

Conversion facile en Swift utilise un constructeur de type particulier.

Comme si vous voulez obtenir Float du double, vous pouvez utiliser Float(doubleValue) et de la même manière si vous voulez convertir float en entier, vous pouvez utiliser Int(floatValue).

Dans ton cas:

let intValue = UInt8(doubleValue)

Attention, vous perdrez toute valeur après le point décimal. Alors, choisissez une meilleure façon. La conversion ci-dessus est juste pour vous aider à comprendre.

Notez que Swift choisit toujours Double (plutôt que Float) lors de l'inférence du type de nombres à virgule flottante.

34
Iducool

Swift ne prend plus en charge la conversion implicite dans Xcode6 GM. La réponse suivante ne s'applique qu'à la version bêta de Xcode6.


Je ne veux pas parler implicitement que le cast est bon ou mauvais, mais vous pouvez l'avoir si vous voulez vraiment avec __conversion()

par exemple. Si tu as besoin UInt8 et Int pouvoir convertir à partir de Double

extension Double {
    func __conversion() -> UInt8 { return UInt8(self) }
    func __conversion() -> Int { return Int(self) }
    // add more if you need to
}

xcrun Swift
Welcome to Swift!  Type :help for assistance.
  1> extension Double {
  2.     func __conversion() -> UInt8 { return UInt8(self) }
  3. }
  4> var d = 1.0
d: Double = 1
  5> var u8 : UInt8 = d
u8: UInt8 = 1
  6>

Remarque: je ne mettrai pas cela dans mon code de production. Je veux seulement le signaler si possible mais ne pas le recommander.

24
Bryan Chen

en utilisant la méthode bridgeToObjectiveC (), vous pouvez appeler les méthodes fournies dans Objective-C pour convertir d'un type de données primitif à un autre, par exemple.

variable_name.bridgeToObjectiveC().intValue

convertira cette variable nommée variable_name en entier

1
Raj