ProgrammationDéveloppeur iOS Mid-level

Comment fonctionne le mécanisme des fonctions mutating dans les structures Swift et pourquoi est-il nécessaire pour modifier les états des types valeur ? Quelles sont les restrictions imposées par les méthodes mutating ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 :

  • Seules les méthodes avec mutating peuvent modifier self et ses propriétés.
  • Il n'est pas possible d'appeler des méthodes mutating sur des constantes (instances let).
  • Dans les structures, self peut être entièrement remplacé à l'intérieur de la méthode mutating.

Questions pièges.

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.

Erreurs typiques et anti-patterns

  • Oublier de déclarer la méthode comme mutating, ce qui empêche la compilation des modifications des propriétés.
  • Utiliser des structures là où il est souvent nécessaire de modifier l'état - dans ces cas, il vaut mieux utiliser une classe.
  • Ignorer les particularités de la copie des structures lors des modifications.

Exemple de la vie réelle

Cas négatif

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 :

  • Fonctionnalité rapidement implémentée.

Inconvénients :

  • Le développeur ne comprend pas l'erreur, perd du temps à déterminer la cause.
  • Les modifications ne sont pas enregistrées, ce qui crée de la confusion dans le code.

Cas positif

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 :

  • Typage strict et comportement prévisible.
  • Haute résilience aux erreurs.

Inconvénients :

  • Une responsabilité supplémentaire de se souvenir de mutating dans la signature.