Historique de la question :
L'optional chaining est apparu dans Swift pour faciliter le travail avec des optionnels imbriqués, permettant d'écrire un code compact et sécurisé sans d'innombrables vérifications de nil. Ceci est particulièrement utile lors de l'accès aux propriétés et méthodes d'objets qui pourraient être absents.
Problème :
En travaillant avec l'optional chaining, il est facile de mal comprendre quel résultat obtiendra si l'un des objets de la chaîne est nil, ou si le retour de valeur n'est pas correctement géré, on peut rencontrer des erreurs d'exécution ou des comportements inattendus.
Solution :
L'optional chaining est un mécanisme qui permet d'accéder en toute sécurité aux propriétés, méthodes et sous-scripts imbriqués d'objets qui peuvent être nil. Si un quelconque élément de la chaîne est nil, toute la structure retourne nil, sans déclencher d'erreur.
Exemple de code :
class Address { var city: String? } class User { var address: Address? } let user: User? = User() user?.address?.city = "Moscou" if let city = user?.address?.city { print(city) } else { print("Ville non trouvée") }
Caractéristiques clés :
Une erreur d'exécution se produit-elle lorsque l'on tente d'appeler une méthode ou d'obtenir une propriété via l'optional chaining, si l'objet est nil ?
Non, aucune erreur d'exécution ne survient. L'ensemble de l'expression via l'optional chaining retourne nil, l'exécution est interrompue sans erreur.
Exemple de code :
let email: String? = nil let lowercased = email?.lowercased() // lowercased sera nil, pas d'erreur
L'attribution via l'optional chaining se produira-t-elle si l'objet intermédiaire est absent ?
Non, si l'objet ou la propriété intermédiaire est nil, l'attribution ne se manifestera en aucune façon et ne modifiera pas la mémoire.
Exemple de code :
var user: User? = nil user?.address?.city = "Kazan" // rien ne se passera, user est nil
Le résultat de l'optional chaining peut-il être non optionnel ?
Non, le résultat de toute expression via l'optional chaining est toujours optionnel, même si la propriété d'origine n'est pas optionnelle.
Exemple de code :
class Test { var number: Int = 10 } let t: Test? = nil let value = t?.number // value: Int? (optionnel)
Dans le code, l'on accède à user?.address?.city sans la vérification de la présence de la ville et on utilise immédiatement city!. Cela provoque un crash si un maillon est nil.
Avantages :
Inconvénients :
Dans le code, on utilise if let ou guard let pour vérifier user?.address?.city et seulement après cela on travaille avec la valeur.
Avantages :
Inconvénients :