ProgrammationDéveloppeur Swift

Expliquez le fonctionnement des propriétés calculées (computed property) en Swift. Quelles sont les principales différences entre les propriétés calculées et les propriétés stockées, et pourquoi les propriétés calculées sont-elles nécessaires ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Historiquement, en Objective-C, les propriétés étaient réalisées à travers des méthodes d'accès (getters et setters). En Swift, une syntaxe spéciale a été introduite pour les propriétés calculées, permettant de créer facilement des propriétés qui calculent leur valeur « à la volée ». Cela élargit les possibilités d'encapsulation et d'expressivité du code des types.

Problème : Il n'est pas toujours pratique de stocker le résultat comme propriété stockée, surtout si la valeur dépend d'autres propriétés ou change constamment. Utiliser des méthodes-calculatrices crée une interface de type moins lisible, cachant sa nature.

Solution : Une propriété calculée est définie à l'aide de get et, si besoin, de set. À chaque accès à cette propriété, un calcul est effectué au lieu d'une lecture en mémoire. Cela permet, par exemple, de construire des propriétés dérivées qui sont automatiquement synchronisées avec le reste de l'état de l'objet.

Exemple de code :

struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } set { // Mise à jour automatique de width selon la nouvelle valeur du champ area (exemple) width = sqrt(newValue / height) } } } var rect = Rectangle(width: 5, height: 2) print(rect.area) // 10 rect.area = 36 print(rect.width) // 3.0

Caractéristiques clés :

  • La propriété calculée n'occupe pas de mémoire supplémentaire, son résultat n'est pas stocké automatiquement.
  • Elle peut avoir uniquement get ou get et set.
  • C'est un moyen pratique de créer des propriétés dérivées ou synchronisées.

Questions pièges.

Peut-on utiliser willSet/didSet avec une propriété calculée ?

Non, willSet et didSet ne s'appliquent qu'aux propriétés stockées. Pour une propriété calculée, ces observateurs ne fonctionnent pas, car il n'y a pas de stockage automatique de la valeur.

Une propriété calculée peut-elle avoir un type optionnel ou implicitement déplié ?

Oui, une propriété calculée peut être optionnelle ou implicitement dépliée. Cependant, il n'est pas judicieux de faire de telles propriétés weak, car elles ne contiennent pas de référence — seulement un calcul.

Dans quels cas est-il préférable d'utiliser private set dans une propriété calculée ?

Le modificateur d'accès private(set) ne peut pas être appliqué à une propriété calculée avec get et set, uniquement à une propriété stockée. Pour une propriété calculée, le set peut être entièrement privé à l'aide de private set, mais cela se réalise implicitement via la disponibilité du bloc set.

public var area: Double { private set { ... } get { ... } }

Erreurs typiques et anti-patrons

  • Exécution de calculs lourds et longs dans le bloc get, entraînant une performance faible.
  • Mutation de l'état à l'intérieur du getter, ce qui enfreint le concept d'accesseurs sans effets secondaires.
  • Mauvaise utilisation du set, lorsque la modification d'une propriété doit influencer plusieurs autres.

Exemple de la vie réelle

Cas négatif

Le getter de la propriété calculée charge de grandes données depuis le réseau à chaque accès, entraînant des freezes et une surcharge du réseau.

Avantages :

  • Facilité d'utilisation pour de petites données.

Inconvénients :

  • Fragilité et comportement imprévisible sur des données réelles.
  • Impact négatif significatif sur les performances et la consommation d'énergie.

Cas positif

La propriété calculée calcule une valeur finale basée sur d'autres propriétés stockées avec un minimum de coûts, la mise en cache de la logique lourde étant déléguée à un mécanisme séparé.

Avantages :

  • Haute performance.
  • Synchronisation de l'état et contrat de fonctionnement prévisible.

Inconvénients :

  • Nécessite un code supplémentaire pour la mise en cache, si le calcul est complexe.