Le type optionnel est un type un peu spécial. C'est le seul type qui autorise une variable à être utilisée sans qu'elle ne possède de valeur. Pour bien comprendre, il faut connaître les différentes phases d'une variable :

  • On commence par déclarer une variable. À cet instant, elle possède un nom et un type mais elle ne possède aucune valeur associée. Elle ne peut donc pas être utilisée.
  • Deuxième phase, l'initialisation de la variable. On lui assigne une valeur. Elle peut maintenant être utilisée.

On ne peut donc pas utiliser une variable qui n'a pas été initialisée.

Tous cela est vrai sauf pour le type optionnel : il permet à une variable d'être utilisée même si elle ne possède pas de valeur, on dit que sa valeur vaut NIL .

La valeur NIL

Voici l'exemple d'une situation ou un optionnel peut être utilisé en cas d'absence de valeur : lorsque l'on veut convertir une variable en type Int. Toutes les chaînes ne peuvent pas être converties en un entier (Int). La chaîne "123" peut être convertie en valeur numérique 123, mais c'est impossible avec la chaîne "bonjour".


let nombre = "123"
let conversion = Int(nombre)
print(conversion)  // Optionnel

Étant donné que la conversion peut échouer et ne renvoyer aucune valeur, on reçoit un type Optionnel Int plutôt qu'un Int.

Un Optionnel Int s'écrit Int?, et non Int. Le point d'interrogation indique que la valeur qu'elle possède est facultative. Cela signifie que la variable peut posséder une valeur Int ou ne posséder aucune valeur du tout.

Elle ne peut contenir aucun autre type de valeur tel qu'un Bool ou un String. C'est soit un Int, soit rien du tout.

let mots = "bonjour"
let connversionMots = Int(mots)
print(connversionMots)  // Nil

On peut assigner la valeur Nil à une variable optionnelle pour qu'elle ne possède aucune valeur :


var age: Int? = 38
age = nil
// Age vaut maintenant Nil
Vous ne pouvez pas utiliser nil avec des constantes ou des variables qui ne sont pas du type optionnel. Si une constante ou une variable de votre code doit fonctionner malgré une absence de valeur temporaire ou non, déclarez-la toujours comme une valeur optionnelle du type approprié.

Si vous définissez une variable optionnelle sans fournir de valeur par défaut, cette variable possède automatiquement nil comme valeur :


var mieuxQueLeSwift: String?
// la variable a Nil comme valeur

La variable mieuxQueLeSwift N'EST PAS DU TYPE String MAIS DU TYPE Optional
Cela se traduit par : "Je suis un optionnel qui contient peut-être un String"

Déballage d'un optionnel

Le type optionnel est très pratique pour gérer une variable qui n'a peut-être pas de valeur. Il existe 3 méthodes pour accéder au contenu de cet optionnel.

Un optionnel, c'est comme une boite dont on ignore le contenu. Elle peut contenir une valeur tout comme être vide. Il va falloir l'ouvrir pour savoir ce qu'elle contient. En Swift, on dit qu'on déballe un optionnel.

1ère Méthode rapide, le déballage forcé

Pour forcer - ou obliger - le déballage d'un optionnel, on utilise le point d'exclamation ! à la fin de cette variable. Attention : il faut être sûr que cette variable possède une valeur sinon, le programme s'arrête.


var mieuxQueLeSwift: String? = "Non"
mieuxQueLeSwift!

2ème Méthode : Le déballage forcé et sécurisé

Une fois que vous êtes sûr que la variable contient une valeur (condition If ), vous pouvez accéder à cette valeur en ajoutant un point d'exclamation (!) à la fin du nom de cette variable.

Le point d'exclamation se traduit par : "Je sais que cet optionnel a une valeur, veuillez l'utiliser". C'est ce qu'on appelle le déballage forcé de la valeur de l'optionnel.


var prenom: String? = "Jean"
if prenom != nil {
    print("Bonjour \(prenom!)")
}

Utiliser ! pour accéder à une valeur facultative inexistante déclenche une erreur d'exécution. Assurez-vous toujours qu'un optionnel contient une valeur différente de Nil avant d'utiliser ! pour forcer le déballage de sa valeur.

3ème Méthode : Déclaration optionnelle ou liaison facultative

On utilise une déclaration optionnelle pour savoir si une variable contient une valeur et, si oui, la rendre disponible en tant que constante ou variable temporaire.


var age: Int? = 38
if let ageVerifie = age {
    print("Tu as \(ageVerifie) ans")
} else  {
    print("Je n'ai pas compris ton age")
}
  1. Le programme vérifie si la variable age vaut Nil
  2. Si elle ne contient pas Nil, le programme crée une constante ageVerifie
  3. La valeur de la variable déballée age est attribuée à la nouvelle constante ageVerifie

L'avantage de cette méthode, c'est que la variable nouvellement créée n'est pas de type optionnel. C'est une variable classique qu'on peut donc utiliser normalement.

Depuis la version 5.7, vous pouvez utiliser le raccourci if let pour déballer un optionnel :


var age: Int? = 38

if let  age {
    print("Tu as \(age) ans")
}
// Cela affiche : "Tu as 38 ans"

Quelle méthode utiliser ?

Pour savoir quelle méthode utiliser, posez-vous les bonnes questions :

  • Si on est absolument sûr que l'optionnel contient une valeur, on peut utiliser le déballage forcé !
  • Si on ne sait pas, deux options : soit on veux juste savoir si l'optionnel est vide (on utilise la condition If). Sinon, on utilise la déclaration optionnelle pour utiliser la valeur de cette variable.

À mémoriser
Un optionnel est un type qui permet à une variable d'être utilisée sans valeur. Dans le cas où l'optionnel ne contient pas de valeur, on dit que sa valeur est Nil.

Opérateur Nil-coalecing

L'opérateur nil-coalescing (a ?? b) déballe un optionnel a s'il contient une valeur, ou renvoie une valeur b par défaut s'il est Nil. L'expression est toujours de type optionnel.

L'opérateur nil-coalescing, ou opérateur de coalescence, est un raccourci pour le code ci-dessous :


a != nil ? a! : b

Le code ci-dessus utilise l'opérateur conditionnel ternaire et le déballage forcé a!.


let defaultColorName = "red"
var userDefinedColorName: String?   // valeur Nil par défaut

var colorNameToUse = userDefinedColorName ?? defaultColorName
// userDefinedColorName est nil, donc colorNameToUse a comme valeur red