Het trefwoord inout in Swift stelt een functie in staat om de waarde van de doorgegeven parameter direct (via een referentie) te wijzigen in plaats van met een kopie te werken. Dit is analoog aan pass-by-reference in sommige andere talen.
Voorbeeld:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // Nu is x == 11
var), je kunt geen let doorgeven.Vraag: Kun je een eigenschap van een structuur doorgeven aan een functie met een inout-parameter, als de structuur daarbij gebruikt wordt als onderdeel van een ander object?
Antwoord: Nee, omdat Swift gelijktijdige toegang tot dezelfde eigenschap binnen één instructie verbiedt (Exclusive Access to Memory), om race conditions en onbepaald gedrag te voorkomen. Voorbeeld:
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) // zal een fout veroorzaken
Verhaal
In één project probeerde een ontwikkelaar dezelfde variabele gelijktijdig door te geven aan twee functieparameters met de inout-modificator, wat leidde tot een compilatiefout. Dit dwong hen om de architectuur van de functie te heroverwegen en de wijzigingen in twee stappen op te splitsen.
Verhaal
Een implementator wijzigde een array via een inout-parameter binnen een lus, wat leidde tot onvoorspelbare resultaten, omdat Swift de inhoud kopieert bij doorgeven, en wijzigingen niet gesynchroniseerd waren tussen de lussen.
Verhaal
Een ontwikkelaar verwachtte dat inout-parameters altijd "via referentie" zouden werken, maar stuitte op copy-in/copy-out-semantiek bij het werken met klassen en structuren, waardoor niet alle wijzigingen werden behouden, als er wordt gewijzigd in geneste structuren.