Swift'te değer türleri (struct, enum, tuple) olarak adlandırılan value semantics'e sahiptir: bir değişkene geçiş veya atama sırasında tüm içerik kopyalanır - bağımsız bir örnek oluşturulur. Bu, referans türünün (class) ortak durumuyla ilişkili birçok karmaşıklıktan kaçınmamızı sağlar.
Ancak, bellek optimizasyonu için koleksiyonlar (örneğin Array, Dictionary, Set) copy-on-write stratejisini kullanır: kopyalama, bir örnek değiştiğinde yalnızca o zaman gerçekleşir.
Örnek:
var a = [1, 2, 3] var b = a b.append(4) print(a) // [1, 2, 3] print(b) // [1, 2, 3, 4]
Burada a dizisi değişmeyecek - başlangıçta ortak bir depolama alanı vardı, b'nin değiştirilmesi durumunda Swift verilerin ayrı bir kopyasını yapacaktır.
Önemli bir nokta: Eğer bir yapı, referans türü (örneğin bir class) içeriyorsa, value semantics yalnızca yapının kendisine uygulanır ve iç içe geçmiş referans nesnelerine uygulanmaz.
Bir diziyi bir fonksiyona geçirip o fonksiyonda düzenlersek dizinin içeriği değişir mi? struct ve class arasındaki farkı açıklayın.
Cevap örneği:
func mutate(_ arr: inout [Int]) { arr.append(100) } var source = [1, 2] mutate(&source) print(source) // [1, 2, 100]
Eğer inout ile geçmezsek, kopyalama otomatik olarak fonksiyon içinde ilk değişiklikte gerçekleşir ve kaynak dizi değişmez. Sınıflar için ise kopyalama gerçekleşmez - başlangıç nesnesi her zaman değişecektir.
Tarih
Geliştiriciler, referans nesnelerini yapı dizisine (struct) koyarak, bir yapı üzerinden yapılan değişikliğin diğer örnekleri etkilemeyeceğini bekliyorlardı. Gerçek şu ki, bir yerdeki referans nesneleri değiştirilirken, beklenmedik bir şekilde her yerde değişiyorlar (paylaşılan durum).
Tarih
Takım projesinde, her erişimde koleksiyonların kopyalanması ile race condition'dan korunmaya çalışıldı. Bu, büyük dizilerle çalışırken beklenmedik bellek masraflarına ve performans düşüşüne yol açtı.
Tarih
Genç bir geliştirici, dizideki değişiklikleri izlemeye çalıştığı için, diziyi aynı anda birkaç işleyici fonksiyona inout ile geçiyordu. Modifikasyonların sırası belirsiz hale geldi ve bu, çoklu iş parçacığı güvensiz değişikliklere, hatalara ve senkronizasyon hatalarına yol açtı.