深入屬性

為什么計算屬性不能有默認值

引用蘋果官方文檔的一句話

In addition to stored properties, classes, structures, and enumerations can define computed properties, which do not actually store a value. Instead, they provide a getter and an optional setter to retrieve and set other properties and values indirectly.
除了存儲屬性以外,class ,struct,enum還可以定義計算屬性,計算屬性實際上不存儲值,而是通過提供個getter方法和可選的setter方法間接的去獲取和設置其他屬性的值。

可以看到存儲屬性作為一個變量或常量在實例中是實實在在存在的,而計算屬性實質(zhì)上確實不存在,對于一個不存在的量也就沒有所謂的初始值/默認值的概念。

為什么存儲屬性沒有getter/setter,為什么計算屬性沒有屬性觀察器

存儲屬性才有屬性觀察器(lazy除外),并且沒有get/set
計算屬性才有get/set,并且沒有屬性觀察器

  • 1存儲屬性是沒有get和set的,這個設計和其他語言看似不同。如Objective-C中屬性由背后的實例變量+方法方法組成(如果不提供屬性的訪問方法,那么系統(tǒng)會默認生成),訪問屬性實質(zhì)上通過訪問方法訪問的內(nèi)部的實例變量。而Swift的屬性沒有所謂的實例變量,訪問屬性就是直接訪問的屬性部分。
    存儲屬性為什么不提供get/set?我認為已經(jīng)提供了就是willSet和didSet
    willSet對應setter | didSet對應get,也就是我為什么說和其他語言看似不同的原因了
  • 2 計算屬性為什么不需要屬性觀察器?
    從上面可以看出,真正對對象實例本身產(chǎn)生修改的還是存儲屬性,而且對計算屬性本身的設置最終還是反應在存儲屬性上的,在最后修改的存儲屬性的地方可以捕獲修改事件不就可以了么?更何況set對于計算屬性來說不能算是屬性觀察器么?
從只讀上說計算屬性和存儲屬性
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容