Słowo kluczowe inout w Swift pozwala funkcji na zmianę wartości przekazanego parametru bezpośrednio (przez referencję), a nie na pracy z kopią. To analogia do pass-by-reference w niektórych innych językach.
Przykład:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // Teraz x == 11
var), nie można przekazać let.Pytanie: Czy można przekazać właściwość struktury do funkcji z parametrem inout, jeśli struktura jest używana jako część innego obiektu?
Odpowiedź: Nie, ponieważ Swift zabrania jednoczesnego dostępu do tej samej właściwości w ramach jednej instrukcji (Exclusive Access to Memory), aby uniknąć race condition i nieokreślonego zachowania. Przykład:
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) // spowoduje błąd
Historia
W jednym projekcie programista próbował przekazać tę samą zmienną jednocześnie do dwóch parametrów funkcji z modyfikatorem inout, co doprowadziło do błędu kompilacji. Zmusiło to do przemyślenia architektury funkcji, dzieląc zmiany na dwa kroki.
Historia
Realizator zmieniał tablicę przez parametr inout w pętli, co prowadziło do nieprzewidzianych wyników, ponieważ Swift kopiuje zawartość przy przekazywaniu, a zmiany nie były synchronizowane między pętla.
Historia
Programista oczekiwał, że parametry inout będą zawsze działać "przez referencję", ale napotkał semantykę copy-in/copy-out przy pracy z klasami i strukturami, przez co nie wszystkie zmiany były zachowywane, jeśli zmieniane były zagnieżdżone obiekty struktur.