mutating getter / nonmutating setter

會改變物件屬性的 getter 與不會改變物件屬性的 setter。

在預設的情況下,getternonmutating,而 settermutating

但如果 getter 內部的程式碼變更了物件的屬性,則這個 getter 必須標註 mutating

反過來說,如果 setter 內部的程式碼沒有變更物件的屬性,那麼這個 setter 就可以標註為 nonmutating,當標註為 nonmutating 之後,就算是一個 let 變數,也可以用這個 setter。

/*
 Mutating Getter & Nonmutating Setter
 https://gist.github.com/hanawat/26f64afba4e6461dc27c
 */

// Mutating Getter
struct Reference {
    
    private let _value: Double  // inner value of this instance
    var          count = 0      // times this inner value has been referenced.
    
    init(value: Double) { _value = value }
    
    var value: Double { 
        mutating get {        // ⭐️ mutating getter
            count += 1        //    mutates `count` property
            return _value
        }
    }
}

var ref = Reference(value: 0.125)
for _ in 0..<5 { print(ref.value) } // reference its value 5 times.
print(ref.count)                    // 5

Last updated