Swift'teki inout anahtar kelimesi, bir fonksiyonun aktarılan parametrenin değerini doğrudan (referans ile) değiştirmesine izin verir; bu, bir kopya ile çalışmak yerine geçerlidir. Bu, bazı diğer dillerdeki pass-by-reference'a benzer.
Örnek:
func increment(_ value: inout Int) { value += 1 } var x = 10 increment(&x) // Artık x == 11
var) çalışır, let ile geçilemez.inout parametresine aynı argümanı geçmek mümkün değildir; bu bir derleme hatasına neden olur (conflicting access).Soru: Bir yapının özelliğini inout parametresi olan bir fonksiyona geçirebilir miyiz, eğer yapı başka bir nesnenin parçası olarak kullanılıyorsa?
Cevap: Hayır, çünkü Swift, aynı talimat içinde aynı özelliğe aynı anda erişimi yasaklar (Exclusive Access to Memory), bu durum yarış koşullarını ve belirsiz davranışları önlemek içindir. Örnek:
struct Point { var x: Int var y: Int } var p = Point(x: 1, y: 2) increment(&p.x) // tamam increment(&p.y) // tamam // increment(&p.x, &p.x) // hata verecek
Hikaye
Bir projede geliştirici, aynı değişkeni iki
inoutmodifikatörlü fonksiyon parametresine aynı anda geçirmeye çalıştı, bu da derleme hatasına yol açtı. Bu, fonksiyonun mimarisini gözden geçirmeye zorladı ve değişiklikleri iki aşamada ayırmaya neden oldu.
Hikaye
Gerçekleştirici, bir
inoutparametre aracılığıyla bir diziyi bir döngü içinde değiştirmeye çalıştı, bu da beklenmedik sonuçlara yol açtı, çünkü Swift, aktarım sırasında içeriği kopyalar ve değişiklikler döngüler arasında senkronize edilmezdi.
Hikaye
Geliştirici,
inoutparametrelerinin her zaman "referans olarak" çalışacağını bekliyordu, ancak sınıflar ve yapılar ile çalışırken copy-in/copy-out semantiği ile karşılaştığı için, yerleşik nesneleri değiştirirken tüm değişikliklerin kaydedilmediğini fark etti.