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
var), vous ne pouvez pas passer un let.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
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.