La parola chiave inout in Swift consente a una funzione di modificare il valore del parametro passato direttamente (per riferimento), invece di lavorare su una copia. Questo è simile al passaggio per riferimento in alcuni altri linguaggi.
Esempio:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // Ora x == 11
var), non è possibile passare let.Domanda: È possibile passare una proprietà di una struttura a una funzione con un parametro inout, se la struttura è utilizzata come parte di un altro oggetto?
Risposta: No, perché Swift vieta l'accesso simultaneo alla stessa proprietà all'interno di una singola istruzione (Accesso Esclusivo alla Memoria), per evitare condizioni di gara e comportamenti imprevedibili. Esempio:
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) // genererà un errore
Storia
In un progetto, un sviluppatore ha cercato di passare la stessa variabile contemporaneamente a due parametri di funzione con il modificatore inout, il che ha portato a un errore di compilazione. Questo ha costretto a rivedere l'architettura della funzione, suddividendo le modifiche in due fasi.
Storia
L'implementatore modificava un array tramite un parametro inout all'interno di un ciclo, il che portava a risultati imprevisti, poiché Swift copia il contenuto al momento della passaggio e le modifiche non venivano sincronizzate tra i cicli.
Storia
Lo sviluppatore si aspettava che i parametri inout funzionassero sempre "per riferimento", ma si è imbattuto nella semantica copy-in/copy-out quando ha lavorato con classi e strutture, il che ha comportato che non tutte le modifiche venissero salvate, se si modificavano oggetti annidati delle strutture.