ProgrammationDéveloppeur iOS/Swift

Quelles sont les particularités du travail avec l'optional chaining en Swift, comment l'utiliser pour traiter des chaînes de valeurs et dans quels cas cela peut-il entraîner des erreurs d'exécution ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Permet d'accéder aux propriétés et méthodes en chaîne, même si au milieu de la chaîne une valeur est nil.
  • La valeur retournée sera toujours optionnelle, indépendamment du type de propriété cible.
  • Peut être utilisée pour appeler des méthodes, des sous-scripts et même pour l'attribution, mais il faut faire attention aux nil non gérés.

Questions pièges.

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)

Erreurs typiques et anti-modèles

  • Ignorer le résultat optionnel et travailler avec lui comme s'il était non optionnel – cela entraîne des erreurs de compilation ou des violations de logique.
  • Tentatives erronées de force unwrap après l'optional chaining.
  • La chaîne est trop longue et confuse, difficile à lire et à déboguer.

Exemple de la vie réelle

Cas négatif

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 :

  • Concision du code

Inconvénients :

  • Risque élevé de crash à l'exécution
  • Mauvaise lisibilité

Cas positif

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 :

  • Garantie de sécurité
  • Logique plus claire

Inconvénients :

  • Plus de code (mais fiable)