Optionnels en Swift

Introduction aux optionnels

En Swift, les optionnels sont des types utilisés pour gérer l'existence potentielle ou l'absence d'une valeur. Contrairement à une variable non optionnelle qui ne peut pas être mise à nil, un type optionnel peut être défini en ajoutant un point d'interrogation ? à la déclaration de type.

Syntaxe des optionnels

Voici comment créer une variable optionnelle. Par exemple, une variable nommée maVariable peut être définie comme suit :

var maVariable: Type?
var maVariable: Optional

Ici, Type représente un type de données en Swift. Cette variable peut contenir soit une valeur valide de ce type, soit nil.

Déballer les optionnels

Le déballage des optionnels ne doit être effectué que si vous êtes certain qu'une valeur est présente, sinon un erreur se produira. Voici quelques méthodes pour déballer les optionnels.

Opérateur de coalescence nulle

L'opérateur de coalescence nulle ?? permet d'assigner une valeur par vérification de gauche à droite. Si les valeurs précédentes sont nil, une valeur par défaut à droite est assignée. Dans l'exemple suivant, peutEtreEntier est déclaré comme un type entier optionnel et est initialisé à nil, donc monInt sera assigné à 27 :

var peutEtreEntier: Int? = nil
var monInt = peutEtreEntier ?? 27
print(monInt) // Affiche : 27

La structure if let

L'instruction if let est un contrôle de liaison optionnel. Dans cet exemple :

var peutEtreChaine: String? = "peutEtreChaine"
if let maChaine = peutEtreChaine {  
    print("\(peutEtreChaine) et maChaine sont égales!")
} else {  
    print("maChaine n'a pas pu être assignée à nil.")
}
// Affiche : Optional("peutEtreChaine") et maChaine sont égales!

La variable maChaine est déclarée et liée conditionnellement à l'optionnel peutEtreChaine. Sa valeur est accessible à l'intérieur du bloc if, mais pas en dehors.

La structure guard let

guard let est une autre structure de liaison optionnelle qui peut être utilisée au sein d'une fonction. Par exemple :

var peutEtreInt: Int? = 2022
func trouverInt() {  
    guard let monInt = peutEtreInt else {    
        return  
    }  
    print(monInt)  
}
trouverInt() // Affiche : 2022

Si la variable optionnelle peutEtreInt a une valeur, elle sera assignée à monInt. Sinon, le bloc else sera exécuté.

Déballage forcé

Utiliser l'opérateur ! après une variable optionnelle permet de forcer le déballage de sa valeur :

var peutEtreInt: Int? = 27
var monInt: Int = peutEtreInt!
print(monInt) // Affiche : 27

Cela peut aussi être fait de manière implicite :

var monInt = peutEtreInt!
print(monInt) // Affiche : 27