Si l'option facultative contient une valeur, l'appel de propriété, de méthode ou d'indice réussit; si l'option facultative est nil, l'appel de propriété, de méthode ou d'indice est renvoyé nil. Plusieurs requêtes peuvent être enchaînées et la chaîne entière échoue si un lien de la chaîne est nil.

Alternative au déballage forcé

Vous spécifiez le chaînage facultatif en plaçant un point d'interrogation (?) après la valeur facultative sur laquelle vous souhaitez appeler une propriété, une méthode ou un indice si l'option facultative est non nil.

Ceci est très similaire à placer un point d'exclamation (!) après une valeur facultative pour forcer le déroulement de sa valeur. La principale différence est que le chaînage facultatif échoue lorsque l'option est nil, tandis que le déballage forcé déclenche une erreur d'exécution lorsque l'option est nil.

Pour refléter le fait que le chaînage facultatif peut être appelé sur une valeur nil, le résultat d'un appel de chaînage facultatif est toujours une valeur facultative, même si la propriété, la méthode ou l'indice que vous interrogez renvoie une valeur non facultative.

Le résultat d'un appel de chaînage facultatif est du même type que la valeur de retour attendue, mais enveloppé dans un élément facultatif.


class Person {
    var residence: Residence?
}

class Residence {
    var numberOfRooms = 1
}

Les instances Residence ont une seule propriété Int appelée numberOfRooms, avec une valeur par défaut de 1. Les instances Person ont une propriété résidence facultative de type Residence?.


let john = Person()

Si vous essayez d'accéder à la propriété numberOfRooms de cette personne residence, en plaçant un point d'exclamation après residence pour forcer le déballage de sa valeur, vous déclenchez une erreur d'exécution, car il n'y a aucune valeur residence à dérouler :


let roomCount = john.residence!.numberOfRooms
// Runtime error

Le chaînage facultatif offre un autre moyen d'accéder à la valeur de numberOfRooms. Pour utiliser le chaînage facultatif, utilisez un point d'interrogation à la place du point d'exclamation :


if let roomCount = john.residence?.numberOfRooms {
    print("John's residence has \(roomCount) room(s).")
} else {
    print("Unable to retrieve the number of rooms.")
}
// Prints "Unable to retrieve the number of rooms."

Cela indique à Swift de "chaîner" la propriété résidence optionnelle et de récupérer la valeur de numberOfRoom si Residence existe.

Vous pouvez utiliser le chaînage facultatif avec des appels à des propriétés, des méthodes et des indices de profondeur de plus d'un niveau. Cela vous permet d'explorer les sous-propriétés dans des modèles complexes de types interdépendants et de vérifier s'il est possible d'accéder aux propriétés, méthodes et indices de ces sous-propriétés.