Swift'te en başından itibaren değer türlerine (value types) — yapılar (struct) veri modelleme için ana araç olarak vurgu yapıldı. Objective-C'den farklı olarak, burada her şey nesne (sınıf) olduğu için, Swift basit modeller, veriler ve küçük iş nesneleri için yapıların kullanılmasını teşvik ediyor.
Diğer nesne yönelimli dillerden deneyim sahibi birçok geliştirici, her şey için yanlışlıkla sınıfları kullanıyor. Bu, bellek sorunlarına (reference cycles), nesnelerin aktarımında beklenmedik değişikliklere ve thread safety ile ilgili zorluklara yol açıyor, çünkü sınıflar — referans türleridir.
Swift'teki yapılar bir değer türüdür (value types), atama ve fonksiyonlara geçişte kopyalanır, sınıfların (referans türleri) aksine. Bu durum, yapıları karmaşık yaşam döngüsü ve miras mantığına sahip olmayan modeller için öncelikli hale getirir.
Kod örneği:
struct Point { var x: Int var y: Int } var p1 = Point(x: 10, y: 20) var p2 = p1 p2.x = 30 // p1.x, 10 olarak kaldı
Önemli özellikler:
Bir yapının mirasçisi (subclass) olabilir mi?
Hayır, Swift'te yapılar miras almayı desteklemez. Davranışın genişletilmesi yalnızca protokoller ve uzantılar üzerinden mümkündür.
Yapılar, bir fonksiyona geçilirken her zaman kopyalanır mı?
Pratikte, Swift Copy-On-Write optimizasyonları kullanır. Yapıyı değiştirmediğimiz takdirde, yapı kopyalanmaz; kopya, yalnızca değişiklik yapıldığında oluşturulur. Bu, standart koleksiyonlar ve karmaşık yapılar için geçerlidir.
var arr1 = [1, 2, 3] var arr2 = arr1 arr2.append(4) // Burada sadece kopyalama gerçekleşir
Hangi durumlarda yapı kullanılamaz?
Aynı türde verileri saklamak için sınıflar kullanıldı (örneğin, haritadaki noktalar için), sonucunda — bellek erişimindeki sıkıntılar nedeniyle performans kaybı, karmaşık bellek yönetimi ve karışık referanslar ile ilgili hatalar meydana geldi.
Artılar:
Eksiler:
Yapıların, güvenli bir şekilde kopyalanan veri modelleri olarak kullanılması, bellek sızıntısına neden olmaz ve gereksiz karmaşıklık içermez.
Artılar:
Eksiler: