Lorsqu'une variable peut prendre la valeur nil, on dira que c'est un optionnel. Dans d'autres langages, on utilise le terme nullable.
Dans cette fiche :
Pour déclarer un optionnel, il faut faire suivre son type par un point d'interrogation.
var valeur: Int?
...
valeur = 36
...
valeur = nil
Autre exemple avec une chaîne de caractères :
var nom: String?
...
nom = "Annie"
...
nom = nil
Le même résultat serait obtenu comme suit mais l'utilisation du point d'interrogation est préférable puisque plus facile à lire.
var nom: Optional<Int>
Il est également possible d'utiliser les optionnels avec des types complexes.
var cartePigee: Carte? = nil
Une autre technique pour déclarer une variable optionnelle est de faire suivre son type par un point d'exclamation. On aura alors une variable implicitement déballée (en anglais : implicitly unwrapped optionnal).
var nom: String!
La différence entre un optionnel implicitement déballé (!) et un optionnel régulier (?), c'est qu'il sera possible d'accéder à l'optionnel implicitement déballé sans avoir recours à l'opérateur de déballage forcé (voir plus bas).
Attention : l'utilisation d'un optionnel implicitement déballé est un compromis entre la commodité et la sécurité. En effet, ceci permet d'accéder à une variable sans devoir la faire suivre par l'opérateur de déballage forcé mais si on accède à cette variable alors que sa valeur est nil, l'application plantera comme c'est le cas avec un optionnel régulier.
Tel que spécifié dans la documentation officielle de Swift, l'utilisation d'optionnels implicitement déballés devrait être réservée aux cas où il est clair qu'une variable optionnelle aura toujours une valeur différente de nil après sa première initialisation.
Swift fait une gestion serrée des optionnels. Il n'est pas possible d'utiliser une variable optionnelle régulière sans prendre les précautions adéquates.
Si vous tentez d'utiliser un optionnel sans précaution, vous obtiendrez un message du genre « Value of optional type 'String?' must be unwrapped to a value of type 'String' ».

Dans le cas où vous êtes absolument certains que la variable n'a pas la valeur nil, vous pouvez faire suivre son nom d'un point d'exclamation.
Dans ce contexte, le point d'exclamation s'appelle opérateur de déballage forcé ou, en anglais, forced unwrapping operator.
Text(nom!)
Mais attention : si jamais la variable avait la valeur nil, le programme planterait avec le message « Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value ».

Il est donc plus prudent de faire la vérification avant d'utiliser le point d'exclamation.
if (nom != nil) {
Text(nom!)
}
Dans le cas où la variable est une instance d'une structure ou d'une classe, le point d'exclamation sera placé après le nom de l'objet, avant le nom de sa propriété.
Image(cartePigee!.image)
Il est également possible d'utiliser l'opérateur de fusion nil' (Nil-Coalescing Operator) pour spécifier la valeur à utiliser si la variable vaut nil.
Text(nom ?? "Annie")
En fait, l'opérateur de fusion nil est un raccourci de l'opérateur ternaire que l'on peut utiliser lorsqu'il faut vérifier si une variable a la valeur nil.
L'instruction précédente est équivalente à celle-ci :
Text(nom != nil ? nom : "Annie")
Lorsqu'un objet est optionnel ou qu'il contient des propriétés optionnelles, il est possible d'utiliser le chaînage d'optionnels (en anglais : optional chaining ou safe call) pour indiquer quoi faire lorsqu'une valeur nulle est rencontrée dans une chaîne d'appels.
Il s'agit d'ajouter un point d'interrogation après le nom de la variable optionnelle. Ceci fait en sorte que le programme ne plantera pas s'il rencontre une valeur nulle. En dernier, on ajoute les doubles points d'interrogation pour indiquer quoi faire si une valeur nulle a été rencontrée dans la chaîne.
let valeur = unObjet.proprieteOptionnelle?.sousPropriete ?? "valeur par défaut"
let premier = items?.first ?? Item(code: "A", titre: "Item A")
« Optional Chaining ». Swift. https://docs.swift.org/swift-book/documentation/the-swift-programming-language/optionalchaining/
« Chaînage d'optionnels (Optional chaining) ». Hacking with Swift. https://www.hackingwithswift.com/read/fr/0/13/chainage-doptionnels-optional-chaining
« Question mark (? vs ?. vs ?? vs ? :) in Swift ». Suneet. https://agrawalsuneet.github.io/blogs/question-mark-in-swift/
▼Publicité