2017-08-20 33 views
1

我讀到有關willset並迅速 性能didset我才知道,我可以像下面的變量有初始值使用這些:我們可以使用willset和didset與getter和setter

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") 
    } 
} 

回答

-1

從蘋果文檔類和結構必須所有的存儲性能的設置適當的初始值到創建該類或結構的實例時爲止。存儲的屬性不能處於不確定狀態。

所以你可以通過添加解決這個問題? VAR property2:字符串{

var property2:String?{ 

    willSet 
    { 
     print("value is about to change") 
    } 
    didSet 
    { 
     print("value is changes") 
    } 
} 
+1

沒有違法,但可選的替代缺失的初始化是最糟糕的建議。 – vadian

0
  • 第一期(第二片段):

    物業/部件不具有初始值,這是錯誤信息說什麼,你需要編寫一個初始化程序或者像第一個代碼片段那樣分配一個初始值。錯誤與觀察者無關。

  • 第二期(第三個片段):

    房產觀察員計算的性質是不允許。你的沒有觀察員的例子不管用(假設propert2是一個錯字,你的意思是property2)。因爲它正在調用自己,setter將導致無限循環。

0

,說你缺乏一個初始化可以通過給物業喜歡你的第一段代碼默認值沒有得到解決的錯誤:

var property2:String = "Some default value"{ 

    willSet 
    { 
     print("value is about to change") 
    } 
    didSet 
    { 
     print("value is changes") 
    } 
} 

現在我會回答你爲什麼不能使用財產觀察員計算屬性。

因爲沒有意義。

對於可設置的計算屬性,您已經擁有setter,因此您可以在設置器中將值設置爲時編寫任何要執行的代碼。爲什麼你需要額外的willSetdidSet?並且對於只能計算的屬性,它不能設置,因此您預計何時執行willSetdidSet

基本上,計算屬性中的set塊已經達到willSetdidSet的目的。您在willSet中編寫的所有內容都可以在設置值之前寫入set。您在didSet寫的一切,你可以在set寫你設置的值之後。

另外,請注意,您的第三個代碼可能會導致堆棧溢出,因爲您在自己的getter中訪問property2並將其設置在其自己的setter中。