ProgrammationDéveloppeur mobile

Parlez des paramètres inout en Swift : comment ils fonctionnent, quand les utiliser et quelles pièges peuvent survenir ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Le mot-clé inout en Swift permet à une fonction de modifier directement la valeur d'un paramètre passé (par référence), plutôt que de travailler avec une copie. C'est l'équivalent de pass-by-reference dans certains autres langages.

Exemple :

func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // Maintenant x == 11

Caractéristiques et nuances :

  • Fonctionne uniquement avec des variables (var), vous ne pouvez pas passer un let.
  • Le paramètre est passé à la fonction par copie (copy-in), les modifications se font localement, et à la fin de la fonction, le résultat est copié de nouveau (copy-out).
  • Vous ne pouvez pas passer le même argument à deux paramètres inout simultanément - cela provoquera une erreur de compilation (accès conflictuel).

Question piège

Question : Peut-on passer une propriété d'une structure à une fonction avec un paramètre inout, si la structure est utilisée comme partie d'un autre objet ?

Réponse : Non, car Swift interdit l'accès simultané à la même propriété dans le cadre d'une instruction (Accès Exclusif à la Mémoire), afin d'éviter les conditions de concurrence et les comportements indéfinis. Exemple :

struct Point { var x: Int var y: Int } var p = Point(x: 1, y: 2) increment(&p.x) // ok increment(&p.y) // ok // increment(&p.x, &p.x) // provoquera une erreur

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans un projet, un développeur a essayé de passer la même variable simultanément à deux paramètres de fonction avec le modificateur inout, ce qui a conduit à une erreur de compilation. Cela a obligé à revoir l'architecture de la fonction, en divisant les modifications en deux étapes.


Histoire

L'implémenteur modifiait un tableau via un paramètre inout à l'intérieur d'une boucle, ce qui entraînait des résultats imprévisibles, car Swift copie le contenu lors du passage, et les modifications n'étaient pas synchronisées entre les boucles.


Histoire

Un développeur s'attendait à ce que les paramètres inout fonctionnent toujours "par référence", mais il a rencontré la sémantique copy-in/copy-out en travaillant avec des classes et des structures, ce qui a conduit à ce que toutes les modifications ne soient pas enregistrées lorsque des objets imbriqués de structures étaient modifiés.