Swift'te willSet ve didSet: nedir, sözdizimi ve gözlemcilerin çalışması

Yazar: IT Sectr Yayınlanma: 2026-06-20 Okuma süresi: 9 dk

willSet ve didSet, Swift'te bir özelliğin değeri değişmeden önce ve sonra kod çalıştırmanıza izin veren özellik gözlemcileridir (property observers). Computed properties'in aksine, gözlemciler yeni bir değer hesaplamaz, yalnızca değişikliğe tepki verir. Apple belgeleri, The Swift Programming Language (2026)'ye göre, gözlemciler veri doğrulama, arayüz senkronizasyonu ve koddaki değişiklikleri günlüğe kaydetme için vazgeçilmezdir.

Temel Noktalar

  • willSet — özelliğin yeni değeri kaydedilmeden önce çağrılır
  • didSet — yeni değer kaydedildikten sonra çağrılır
  • newValue — willSet içinde yeni değeri içeren örtük parametre
  • oldValue — didSet içinde eski değeri içeren örtük parametre
  • Gözlemciler — başlatma sırasında ve init içinde çalışmaz

Swift'te willSet ve didSet nedir?

willSet ve didSet, Swift'te stored properties'teki değişiklikleri izlemek için yerleşik bir mekanizma olan özellik gözlemcileridir (property observers).

Manuel setter uygulaması veya geri çağırma sistemleri gerektiren diğer dillerin aksine, Swift değişikliklere tepki vermek için bildirimsel bir sözdizimi sağlar. Gözlemciler, özellik bildiriminden hemen sonra eklenir ve ayrı bir çağrı gerektirmez.

Apple Geliştirici Belgeleri'ne (2026) göre, property observers herhangi bir sınıf, yapı veya numaralandırmanın stored properties'i için desteklenir. Computed properties ile çalışmazlar çünkü bunlar bir değer depolamaz — onlar için değişikliğe tepki doğrudan setter içinde uygulanır.

willSet ne zaman çağrılır

willSet, özelliğe yeni bir değer atanmadan hemen önce çağrılır. willSet içinde, ayarlanacak değeri içeren örtük parametre newValue mevcuttur. Bu anda, özelliğin mevcut değeri henüz değişmemiştir — eski değeri doğrudan özellik aracılığıyla okuyabilirsiniz.

Swift Evolution teklifi SE-0001 (2024)'e göre, willSet gerçek değişiklikten önce doğrulama veya günlük kaydı yapma imkanı sağlar. willSet içinde bir istisna atılırsa, yeni değer uygulanmaz ve gözlemcileri bir veri koruma mekanizması haline getirir.

didSet ne zaman çağrılır

didSet, yeni bir değer atandıktan hemen sonra çağrılır. didSet içinde, değişiklikten önceki değeri içeren örtük parametre oldValue mevcuttur. Bu noktada, özellik zaten yeni değeri içerir ve bunu eski değerle karşılaştırabilirsiniz.

Swift by Sundell (2025)'e göre, didSet en popüler gözlemcidir çünkü en sık son işleme için gereklidir: kullanıcı arayüzünü güncelleme, bağımlı alanları yeniden hesaplama veya bir değişiklikten sonra sunucuya veri gönderme.

Özellik gözlemcisi sözdizimi

Property observers, özelliğin hemen ardından süslü parantezler kullanılarak bildirilir. Minimum sözdizimi yalnızca bir gözlemci gerektirir, ancak her ikisini de bildirebilirsiniz.

swift
var score: Int = 0 {
    willSet {
        print("Puan \(newValue) olarak değişecek")
    }
    didSet {
        print("Puan \(oldValue) konumundan \(score) olarak değişti")
    }
}

Her iki gözlemci de isteğe bağlıdır — yalnızca willSet veya yalnızca didSet belirtebilirsiniz. willSet için parantez içinde bir ad belirterek newValue'yu yeniden adlandırabilirsiniz.

swift
var username: String = "guest" {
    willSet(newName) {
        print("\(newName) ayarlanmak üzere")
    }
    didSet(oldName) {
        print("Önceden \(oldName), şimdi \(username)")
    }
}

Swift Language Guide (2026)'ye göre, parametreleri yeniden adlandırmak, özellikle uzun adlara sahip büyük bir projede özellik ve gözlemciler kullanıldığında kod okunabilirliğini artırır.

willSet ve didSet nasıl çalışır

Yürütme sırası kesin olarak tanımlanmıştır: önce willSet (eski değer mevcut), sonra atama, sonra didSet (yeni değer mevcut).

swift
class Temperature {
    var celsius: Double = 0.0 {
        willSet {
            print("Sıcaklık \(celsius) konumundan \(newValue) olarak değişecek")
        }
        didSet {
            if celsius > 100.0 {
                print("Kaynama noktası aşıldı!")
            }
        }
    }
}

Önemli bir sınırlama: bir örnek oluştururken özellik başlatma sırasında gözlemciler çağrılmaz. init içinde bir değer atamak willSet ve didSet'i tetiklemez — bu, yapım aşamasında istenmeyen yan etkileri önler.

Apple Swift Blog'una (2025) göre, bu davranış, setter'ların yapıcılarda bile çağrıldığı diğer birçok dilden farklıdır. Swift güvenliği seçer: gözlemciler yalnızca nesne başlatma tamamlandıktan sonra çalışmaya başlar.

İç içe çağrılar ve özyineleme

didSet içinde bir özelliği değiştirmek, tekrarlanan gözlemci çağrılarına yol açabilir. Swift özyinelemeyi engellemez — programcı bunu manuel olarak kontrol etmelidir.

swift
var counter: Int = 0 {
    didSet {
        if counter < 5 {
            counter += 1
        }
    }
}

Böyle bir kod, bir çıkış koşulu sağlanmazsa yığın taşmasıyla tam özyineleme oluşturacaktır. Stack Overflow Swift Topluluğu'na (2025) göre, bu, yeni başlayanların property observers ile çalışırken yaptığı en yaygın hatalardan biridir.

Yapı özellikleri için gözlemciler

Yapılar, stored properties için willSet ve didSet'i kısıtlama olmaksızın destekler. Yapıların değer türleri olduğunu ve mutating bir metodun içinde bir özelliği değiştirmenin de gözlemcileri tetiklediğini hatırlamak önemlidir.

swift
struct Point {
    var x: Double = 0.0 {
        didSet {
            print("X, \(x) olarak değişti")
        }
    }
    var y: Double = 0.0 {
        didSet {
            print("Y, \(y) olarak değişti")
        }
    }
}

var point = Point()
point.x = 5.0

Gerçek projelerde gözlemci kullanımı

Özellik gözlemcileri, Swift projelerinde kullanıcı arayüzü senkronizasyonundan veri doğrulama ve günlük kaydına kadar geniş bir yelpazede görev için kullanılır.

Değer doğrulama

didSet, geçersiz bir değeri ayarlandıktan hemen sonra geri almanıza veya düzeltmenize olanak tanır. Bu, Objective-C'deki hantal setter'ların yerini alır ve model düzeyinde veri bütünlüğünü sağlar.

swift
var age: Int = 0 {
    didSet {
        if age < 0 || age > 150 {
            age = oldValue
        }
    }
}

Kullanıcı arayüzü senkronizasyonu

İlgili bir özellik değiştiğinde, ayrı bir güncelleme metodu çağrısı olmadan arayüz öğelerini otomatik olarak güncelleyebilirsiniz.

swift
var userName: String = "" {
    didSet {
        nameLabel.text = userName
    }
}

Değişiklik günlüğü

willSet, hata ayıklama veya denetim amaçlı günlük kaydı için uygundur. Uygulamadan önce zamanı ve yeni değeri kaydederek günlüğün analiz için orijinal verileri içermesini sağlayabilirsiniz.

objc.io'ya (2025) göre, property observers özellikle tek yönlü veri akışına sahip mimarilerde kullanışlıdır; burada her özellik değişikliği daha sonraki durum yeniden üretimi için kaydedilir.

Computed properties ile karşılaştırma

Computed properties anında bir değer hesaplar ve depolama alanına sahip değilken, willSet ve didSet gerçek bir değere sahip stored property üzerinde çalışır.

ÖzellikProperty ObserversComputed Properties
Değeri saklarEvetHayır
Değişiklikte kod çalıştırırEvetHayır
Bildirim türüvarvar (get/set)
Erişim parametrelerinewValue, oldValuenewValue (set içinde)
BaşlatmaBaşlangıç değeri gerektirirGerekmez

Temel fark: computed property her erişimde bir değer hesaplarken, property observer mevcut bir değerin değişikliğine tepki verir. Aralarındaki seçim anlambilim tarafından belirlenir — özellik diğer verilerden türetilmişse computed kullanın; değişiklikleri izlenmesi gereken bağımsız bir değerse willSet/didSet kullanın.

Kullanımda yaygın hatalar

En yaygın hata, çıkış koşulu olmadan didSet'in özyinelemeli olarak çağrılmasıdır. didSet içindeki her özellik değişikliği gözlemciyi yeniden tetikleyerek sonsuz döngüye yol açar.

İkinci yaygın hata, let özelliklerinde gözlemci kullanmaya çalışmaktır. let bir sabit olduğu için Swift derleyicisi bir hata verecektir.

Üçüncü hata, gözlemcinin başlatma sırasında çağrılmadığını göz ardı etmektir. init içinde willSet'in tetiklenmesini bekleyen geliştiriciler beklenmeyen davranışla karşılaşır.

Dördüncü sorun, uzantılardaki özelliklere gözlemci uygulamaktır. Swift, uzantılarda stored properties'e willSet/didSet eklemeyi yasaklar.

Ray Wenderlich'e (2025) göre, bu sınırlamaları anlamak, erken aşamalarda hatalardan kaçınmaya yardımcı olur ve Swift kodunu daha öngörülebilir hale getirir.

Sıkça Sorulan Sorular

willSet, didSet olmadan kullanılabilir mi?

Evet, her gözlemci isteğe bağlıdır. Yalnızca willSet, yalnızca didSet veya her ikisini birden bildirebilirsiniz.

Gözlemciler uzantılarda çalışır mı?

Hayır, Swift, uzantılarda stored properties için willSet ve didSet eklemeyi yasaklar. Gözlemciler yalnızca orijinal tür tanımında bildirilir.

init içinde bir özellik değiştirildiğinde gözlemciler çağrılır mı?

Hayır, başlatma sırasında gözlemciler çağrılmaz. Bu, nesne yapım aşamasında yan etkileri önleyen bir koruma mekanizmasıdır.

willSet, computed property'deki bir setter'dan nasıl farklıdır?

willSet, değer değişmeden önce yürütülen bir stored property gözlemcisidir. Computed property'deki bir setter, yeni bir değer hesaplama yoludur, mevcut bir değeri gözlemleme değil.

didSet içinde bir özellik değiştirilirse ne olur?

Tekrarlanan didSet çağrısı özyinelemeye neden olur. Çıkış koşulu olmadan bu, yığın taşmasına ve programın sonlanmasına yol açar.

Özet

  • willSet — özellik değişmeden önce yürütülen gözlemci, newValue'a erişim ile
  • didSet — özellik değiştikten sonra yürütülen gözlemci, oldValue'a erişim ile
  • Sözdizimi — gözlemciler özellik bildiriminden sonra süslü parantezlerde bildirilir
  • Başlatma — gözlemciler init içinde ve varsayılan değer ayarlanırken çalışmaz
  • Kullanım — doğrulama, kullanıcı arayüzü senkronizasyonu, günlük kaydı, değişiklik denetimi
  • Özyineleme — didSet içinde özellik değiştirmek açık bir çıkış koşulu gerektirir
  • Computed — computed properties ile karıştırmayın: gözlemciler gözlemler, computed hesaplar

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun