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 :
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 { ... } }
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 :
Inconvénients :
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 :
Inconvénients :