ProgramlamaMobil Geliştirici

Swift'teki inout parametreleri hakkında konuşun: nasıl çalışırlar, ne zaman kullanılmalı ve hangi tuzaklarla karşılaşabilirsiniz?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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

Özellikler ve ince noktalar:

  • Sadece değişkenlerle (var) çalışır, let ile geçilemez.
  • Fonksiyona parametre, kopya (copy-in) olarak geçilir, değişiklikler yerel olarak yapılır ve fonksiyon tamamlandığında sonuç geri kopyalanır (copy-out).
  • Aynı anda iki inout parametresine aynı argümanı geçmek mümkün değildir; bu bir derleme hatasına neden olur (conflicting access).

Hileli soru

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

Konuyla ilgili yanlış anlamalardan kaynaklanan gerçek hata örnekleri.


Hikaye

Bir projede geliştirici, aynı değişkeni iki inout modifikatö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 inout parametre 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, inout parametrelerinin 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.