[英]Can we use willSet and didSet with getter and setter?
我正在閱讀有關 swift 屬性的 willset 和 didset 我開始知道我可以將這些與具有初始值的變量一起使用,如下所示:
var property = "name"
{
willSet
{
print("property is about to changed")
}
didSet
{
if property == oldValue
{
print("values are same")
}
else
{
print("value changed")
}
}
}
property = "anothername"
那么我可以像下面這樣使用 willget 和 didset 嗎:
var property2:String{
willSet
{
print("value is about to change")
}
didSet
{
print("value is changes")
}
}
它給了我這個錯誤:
non-member observing properties require an initializer
var property2:String{
^
所以任何人都可以向我解釋這里發生了什么,我可以將 getter 和 setter 與 willset 和 didset 一起使用,例如:
var property2:String{
get{return property2}
set{propert2 = newValue}
willSet
{
print("value is about to change")
}
didSet
{
print("value is changes")
}
}
可以通過為該屬性提供一個默認值來解決缺少初始化程序的錯誤,就像您的第一段代碼所做的那樣:
var property2:String = "Some default value"{
willSet
{
print("value is about to change")
}
didSet
{
print("value is changes")
}
}
現在我將回答為什么你不能在計算屬性上使用屬性觀察器。
因為沒有意義。
對於可設置的計算屬性,您已經有了 setter,因此您可以編寫在 setter 中設置值時要執行的任何代碼。 為什么需要額外的willSet
或didSet
? 而對於一個 get-only 計算屬性,它不能被設置,那么你期望willSet
和didSet
什么時候執行?
基本上,計算屬性中的set
塊已經實現了willSet
和didSet
的目的。 您在willSet
中寫入的所有內容都可以在set
值之前將其寫入 set 中。 您在didSet
中寫入的所有內容都可以在set
值后寫入set
。
另外,請注意,您的第三個代碼可能會導致堆棧溢出,因為您正在其自己的 getter 中訪問property2
並將其設置在其自己的 setter 中。
第一個問題(第二個片段):
屬性/成員沒有初始值,這就是錯誤消息所說的,您需要編寫一個初始化程序或分配一個初始值,就像在第一個片段中一樣。 該錯誤與觀察者無關。
第二個問題(第三個片段):
不允許在計算屬性中使用屬性觀察者。 你沒有觀察者的例子無論如何都不起作用(假設propert2
是一個錯字,你的意思是property2
)。 setter 將導致無限循環,因為它正在調用自己。
來自 Apple Doc 類和結構必須在創建該類或結構的實例時將其所有存儲的屬性設置為適當的初始值。 存儲的屬性不能處於不確定狀態。
所以你可以通過添加來解決這個問題? var property2:String?{
var property2:String?{
willSet
{
print("value is about to change")
}
didSet
{
print("value is changes")
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.