web-dev-qa-db-fra.com

Affectation de plusieurs variables dans Swift

Comment attribuer plusieurs variables sur une seule ligne à l'aide de Swift?

    var blah = 0
    var blah2 = 2

    blah = blah2 = 3  // Doesn't work???
36
hamobi

Non.

Ceci est une fonctionnalité de langage pour empêcher l'effet secondaire indésirable standard de l'affectation renvoyant une valeur, comme décrit dans le livre Swift :

Contrairement à l'opérateur d'affectation en C et Objective-C, l'opérateur d'affectation en Swift ne renvoie pas lui-même de valeur. L'instruction suivante n'est pas valide:

   if x = y {
       // this is not valid, because x = y does not return a value
   }

Cette fonction empêche l'opérateur d'affectation (=) d'être utilisé par accident lorsque l'opérateur égal à (==) est en fait prévu. En faisant si x = y invalide, Swift vous aide à éviter ce genre d'erreurs dans votre code.

Ainsi, cela permet d'éviter cette erreur extrêmement courante. Bien que ce type d'erreur puisse être atténué dans d'autres langues, par exemple, en utilisant conditions Yoda - les Swift designers ont apparemment décidé qu'il valait mieux s'assurer de le niveau de langue que vous ne pouviez pas vous tirer dans le pied. Mais cela signifie que vous ne pouvez pas utiliser:

blah = blah2 = 3

Si vous êtes désespéré de faire l'affectation sur une seule ligne, vous pouvez utiliser la syntaxe Tuple, mais vous devrez quand même assigner spécifiquement chaque valeur:

(blah, blah2) = (3, 3)

... et je ne le recommanderais pas. Bien que cela puisse sembler gênant au début, il suffit de taper le tout pour le mieux, à mon avis:

blah = 3
blah2 = 3
67
Matt Gibson

Comme le dit la réponse acceptée: vous pouvez obtenir une syntaxe plus stricte, mais vous ne pouvez pas attribuer de a à b à c sans utiliser plusieurs lignes (par sécurité, probablement). Voici un exemple de syntaxe plus concise pour déclarer et affecter plusieurs variables sur une seule ligne:

var red, green, blue, alpha : CGFloat
(red, green, blue, alpha) = (0.0, 0.0, 0.0, 0.0)
ledColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
3
Dan Rosenstark