Swift'teki özellik gözlemcileri (property observers), bir özelliğin değeri değiştiğinde tepki vermeyi sağlar. Bu kavram, veri değişiklikleri üzerindeki kontrolün şeffaflığını artırmak ve değişiklikler sırasında mantığı otomatikleştirmek için Swift ile birlikte ortaya çıktı.
Tarihi:
Swift'ten önce, benzer bir davranış genellikle manuel olarak setter'lar veya özel yöntemler aracılığıyla uygulanıyordu. Swift ile gözlemciler, dilde standart bir araç haline geldi.
Sorun:
Geliştiricinin bir özelliğin değişim anını yakalayabilmesi önemlidir - örneğin, UI'yı güncellemek veya veri doğrulaması yapmak için. Gözlemciler olmadan, kod daha karmaşık ve okunması zor hale geliyordu.
Çözüm:
Swift'te iki temel gözlemci mevcuttur:
willSet değeri değiştirmeden önce çağrılırdidSet yeni değer atandıktan sonra çağrılırGözlemciler, lazy özellikler ve hesaplanan (computed) özellikler hariç, saklanan (stored) özelliklere eklenebilir.
Kod örneği:
class Temperature { var celsius: Double { willSet { print("Hedef değer:", newValue) } didSet { print("Önceki değer:", oldValue, ", Yeni değer:", celsius) } } init(celsius: Double) { self.celsius = celsius } } let temp = Temperature(celsius: 22) temp.celsius = 28 // willSet ve didSet çağrılacak
Anahtar özellikler:
Hesaplanan (computed) özelliklere gözlemci eklenebilir mi?
Hayır, computed özelliklere willSet ve didSet eklenemez, çünkü zaten kendi getter ve setter'ları vardır. willSet/didSet kullanımı yalnızca saklanan (stored) özellikler için geçerlidir.
İnitializer içinde bir özelliğin değişimi gözlemcileri tetikler mi?
Hayır, property observers init sırasında tetiklenmez. Değişiklikler ancak init tamamlandıktan sonra değer değiştiğinde meydana gelir.
Kendisine mevcut değeri atandığında, örneğin x = x olduğunda ne olur?
Gözlemciler, değer değiştirilse bile çağrılmaya devam eder! Bu yanıltıcı mantığın gerçekleşmesine neden olabilir - dikkatli olun.
var value: Int = 0 { didSet { print("didSet her zaman çağrılır!") } } value = value // didSet çağrılacak
Geliştirici, değer değişimini kontrol etmeden didSet içinde arayüz güncellemesi gerçekleştirdi. UI, ''boş'' atama gerçekleştiğinde bile güncelleniyordu, bu da performansı düşürdü.
Artılar:
Eksiler:
DidSet içinde eski ve yeni değerlerin eşitliğini kontrol edildi. Arayüz yalnızca değer gerçekten değiştiğinde güncelleniyordu.
Artılar:
Eksiler: