Innerhalb des Funktionskörpers werden Parameter wie Konstanten behandelt, nicht wie Variablen. Der Versuch, den Wert eines Parameters zu ändern, führt zu einem Compilerfehler. Wenn eine Funktion den Wert eines Parameters ändern möchte, muss sie einen In-out-Parameter verwenden, um diese Veränderbarkeit ausdrücklich zu machen.
Um In-out-Parameter zu verwenden, muss man auf drei Dinge achten:
inout zwischen dem : und dem Typnamen in der Typannotation des Parameters schreibst.& vorangestellt werden, wodurch er ausdrücklich als veränderbar gekennzeichnet wird.Wenn das geschieht, legt die Funktion eine interne Kopie des In-out-Parameters an, ändert sie wie im Funktionskörper beschrieben und kopiert den geänderten Wert anschließend wieder in die Variable zurück, die beim Aufruf übergeben wurde, sobald die Funktion zurückkehrt.
func updateVersion(_ record: inout (version: Int, title: String)) {
record.version += 1
}
var dbRecord = (version: 2, title: "Exercism")
updateVersion(&dbRecord)
// dbRecord is now (3, "Exercism")
Bei In-out-Parametern gibt es ein paar zusätzliche Regeln, die du kennen solltest.
1. Innerhalb einer Funktion mit In-out-Parametern darfst du nicht auf die Variable verweisen, die als In-out-Parameter übergeben wurde.
2. Dieselbe Variable kann in derselben Funktion nicht als mehrere In-out-Parameter übergeben werden.
Zum Beispiel löst `inoutFunc(&mutVar, &mutVar)` einen Compilerfehler aus.