Formation PUB900 : Développer une application pour iPhone avec SwiftUI, H-2024 Le langage Swift (référence)

61.4 Les optionnels (?, !, ??)


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 :

Déclaration

Pour déclarer un optionnel, il faut faire suivre son type par un point d'interrogation.

Swift

var valeur: Int?
...
valeur = 36
...
valeur = nil

Autre exemple avec une chaîne de caractères :

Swift

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.

Swift

var nom: Optional<Int>

Il est également possible d'utiliser les optionnels avec des types complexes.

Swift

var cartePigee: Carte? = nil

Optionnels implicitement déballés

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).

Swift

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.

Utilisation

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' ».

Value of optional type 'String?' must be unwrapped to a value of type 'String'

Opérateur de déballage forcé (!)

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.

Swift

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 ».

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.

Swift

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é.

Swift

Image(cartePigee!.image)

Opérateur de fusion nil (??)

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.

Swift

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 :

Swift

Text(nom != nil ? nom : "Annie")

Chaînage d'optionnels (?)

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.

Swift

let valeur = unObjet.proprieteOptionnelle?.sousPropriete ?? "valeur par défaut"

Swift

let premier = items?.first ?? Item(code: "A", titre: "Item A")

Pour plus d'information

« 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é

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Merci de partager !
Soumettre