Swift'te willSet ve didSet'in amacı nedir?

Swift, C#'ninkine çok benzeyen bir özellik bildirimi sözdizimine sahiptir:

var foo: Int {
    get { return getFoo() }
    set { setFoo(newValue) }
}

Bununla birlikte, willSet ve didSet eylemlerine de sahiptir. Bunlar sırasıyla setter çağrılmadan önce ve sonra çağrılır. Aynı kodu setter içinde de kullanabileceğinizi düşünürsek, bunların amacı nedir?

Çözüm

Mesele şu ki, bazen otomatik depolama ve bazı davranışlara sahip bir özelliğe ihtiyaç duyarsınız, örneğin özelliğin değiştiğini diğer nesnelere bildirmek için. Elinizdeki tek şey get/set olduğunda, değeri tutmak için başka bir alana ihtiyacınız olur. willSetvedidSet` ile, değer değiştirildiğinde başka bir alana ihtiyaç duymadan işlem yapabilirsiniz. Örneğin, bu örnekte:

class Foo {
    var myProperty: Int = 0 {
        didSet {
            print("The value of myProperty changed from \(oldValue) to \(myProperty)")
        }
    }
}

myProperty` her değiştirildiğinde eski ve yeni değerini yazdırır. Sadece getters ve setters ile bunun yerine buna ihtiyacım olacaktı:

class Foo {
    var myPropertyValue: Int = 0
    var myProperty: Int {
        get { return myPropertyValue }
        set {
            print("The value of myProperty changed from \(myPropertyValue) to \(newValue)")
            myPropertyValue = newValue
        }
    }
}

Dolayısıyla willSet ve didSet birkaç satırlık bir ekonomiyi ve alan listesinde daha az gürültüyü temsil eder.

Yorumlar (9)

Bunlara Özellik Gözlemcileri denir:

Mülk gözlemcileri bir mülkteki değişiklikleri gözlemler ve bunlara yanıt verir değer. Özellik gözlemcileri, bir özelliğin değeri her değiştiğinde çağrılır set, yeni değer özelliğin geçerli değeriyle aynı olsa bile değer.

Alıntı: Apple Inc. "Swift Programlama Dili." iBooks. https://itun.es/ca/jEUH0.l

Bunun geleneksel olarak KVO ile yaptığımız UI öğeleriyle veri bağlama veya bir özelliği değiştirmenin yan etkilerini tetikleme, bir senkronizasyon sürecini tetikleme, arka plan işleme vb. gibi şeylere izin verdiğinden şüpheleniyorum.

Yorumlar (0)

Getter ve setter bazen sadece uygun değer değişikliklerini gözlemlemek için uygulanamayacak kadar ağırdır. Genellikle bunun için ekstra geçici değişken kullanımı ve ekstra kontroller gerekir ve yüzlerce getter ve setter yazıyorsanız bu küçük işlerden bile kaçınmak isteyeceksiniz. Bu şeyler durum içindir.

Yorumlar (2)