Dans Swift, les structures (struct) sont par défaut des types valeur : à la copie d'une instance de structure, une copie indépendante est créée. Cependant, à la différence des classes, les méthodes de structure ne peuvent pas modifier self et ses propriétés sans l'autorisation explicite du compilateur. Dans les premières versions des langages C et C++, les structures étaient toujours mutables, ce qui entraînait des effets secondaires inattendus. Swift améliore la sécurité en exigeant de marquer explicitement les méthodes qui modifient l'état de la structure avec le mot-clé mutating.
Le problème se pose si une méthode est nécessaire pour modifier les propriétés de la structure, mais est déclarée comme normale, et le compilateur n'autorise pas cela. Sans mutating, il n'est pas possible de modifier self ou ses propriétés.
La solution consiste à déclarer de telles méthodes avec le mot-clé mutating, ce qui donne au compilateur le signal d'autoriser la modification de self et de ses propriétés imbriquées.
Exemple de code :
struct Counter { var value = 0 mutating func increment() { value += 1 } // Cette méthode NE sera pas compilée si mutating est enlevé } var counter = Counter() counter.increment() // value devient 1
Caractéristiques clés :
1. Peut-on appeler des méthodes mutating sur une structure déclarée avec let ?
Non, ce n'est pas possible. Les valeurs constantes let des structures ne peuvent pas être modifiées, même avec des méthodes mutating.
let counter = Counter() counter.increment() // Erreur de compilation
2. Les propriétés imbriquées d'une classe à l'intérieur d'une structure peuvent-elles être modifiées dans la méthode mutating de la structure ?
Oui, si la propriété de la structure est un type référence (par exemple, une classe), ses propriétés internes peuvent être modifiées même sans mutating, mais la structure entière ne peut être modifiée que via mutating.
class State { var value = 0 } struct Wrapper { var state = State() mutating func change() { state.value += 1 } }
3. Peut-on modifier uniquement une propriété calculée à l'intérieur d'une méthode sans mutating ?
Non. Si la propriété calculée a un set, modifier sa valeur à l'intérieur de la méthode nécessite toujours mutating.
Un projet implémente un simple compteur avec une structure, mais le développeur a oublié de marquer la méthode comme mutating. Les tests échouent car la valeur ne change pas.
Avantages :
Inconvénients :
Les méthodes dans la structure sont marquées mutating, les tests réussissent, les modifications sont mises à jour correctement. Le code est compréhensible pour tous les membres de l'équipe.
Avantages :
Inconvénients :