ProgramlamaiOS geliştirici

Swift'te gözlemcileri (property observers) olan özellikler nasıl çalışır ve ne işe yarar?

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

Cevap.

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ır
  • didSet yeni değer atandıktan sonra çağrılır

Gö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:

  • willSet gözlemcisinde yeni değer için özel bir değişken newValue bulunmaktadır.
  • didSet gözlemcisinde ise eski değer için oldValue bulunmaktadır.
  • Özelliklerin init sırasında başlatılması sırasında gözlemciler çağrılmaz.

Kandırmaca sorular.

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

Tipik hatalar ve anti-pattemler

  • Yan etkilerden bağımlılık: didSet/willSet içinde sadece iş mantığının uygulanması, kodu şeffaflaştırmaz.
  • ''Boş'' bir değer değişikliği olduğunda, yan etkilerin yanlış yönetimi.
  • Hesaplanan özellikler için gözlemcilerin kullanımı yerine setter'da davranışın uygulanması.

Gerçek hayat örneği

Olumsuz durum

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:

  • Hızlı uygulama, az kod

Eksiler:

  • Gereksiz işlemlerin sayısı arttı, hata ayıklama zorlaştı.

Olumlu durum

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:

  • Yan etkilerin minimuma indirilmesi, yüksek performans

Eksiler:

  • Ek bir if kontrolü gerekti, biraz daha fazla kod