mutating getter / nonmutating setter
會改變物件屬性的 getter 與不會改變物件屬性的 setter。
在預設的情況下,getter 是 nonmutating,而 setter 是 mutating。
但如果 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
Was this helpful?