Cette section a été relue et corrigée, elle prend maintenant en compte les modifications apportées avec Swift 2.

L’opérateur d’union nil (a ?? b) déclare une optionnelle a si elle contient une valeur, ou retourne par défaut la valeur de b si a est nil. L’expression a est toujours du type optionnel. L’expression b doit coïncider avec le type qui est stocké à l’intérieur de a.

L’opérateur d’union nil est présenté de façon raccourci pour le code suivant :

a != nil ? a! : b

Le code ci-dessus utilise l’opérateur conditionnel ternaire et force l’ouverture (a!) pour accéder à la valeur à l’intérieur de a quand a n’est pas nil, et à retourner b le cas échéant. L’opérateur d’union nil permet d’une façon plus élégante de combiner la vérification conditionnelle tout en dévoillant les valeurs d’une manière concise et plus simple à lire.

Note : Si la valeur de a est non-nil, la valeur de b n’est pas prise en compte. C’est une évaluation en circuit court.

L’exemple suivant utilise l’opérateur d’union nil pour choisir entre une couleur par défaut et une couleur optionnelle sélectionnée par l’utilisateur :

1 let couleurDefaut = "rouge"
2 var couleurUtilisateur: String? // nil par défaut
3 
4 var couleurDefinitive = couleurUtilisateur ?? couleurDefaut
5 /* L'utilisateur n'a pas définit de couleur
6 couleurUtilisateur vaut nil
7 du coup couleurDefinitive est fixée à "rouge" */

La variable couleurUtilisateur est définie en tant qu’optionnelle de type String, avec une valeur par défaut à nil. C’est parce-que couleurUtilisateur est du type optionnel que l’on peut utiliser ici l’opérateur d’union nil afin d’obtenir à coup sur une valeur pour couleurDefinitive.

Comme couleurUtilisateur est nil, l’expression couleurUtilisateur ?? couleurDefaut retourne la valeur de couleurDefaut, soit “rouge”.

Si vous assignez une valeur non-nil à couleurUtilisateur et utilisez l’opérateur d’union à nouveau, la valeur par défaut deviendra alors celle définie par l’utilisateur :

1 couleurUtilisateur: "vert"
2 couleurDefinitive = couleurUtilisateur ?? couleurDefaut
3 /* couleurUtilisateur ne vaut plus nil
4 du coup couleurDefinitive est fixée à "vert" */