定義
Swift中跟實例相關(guān)的屬性可以 分為2大類,存儲屬性和計算屬性

demo
存儲屬性
- 類似于成員變量這個概念
- 存儲在實例的內(nèi)存中
- 結(jié)構(gòu)體、類可以定義存儲屬性
- 枚舉
不可以定義存儲屬性
存儲屬性初始值
- 在創(chuàng)建類或結(jié)構(gòu)體的實例是,必須為所有的存儲屬性設置一個合適的初始值
- 可以在初始化器里為存儲屬性設置一個初始值
- 可以分配一個默認的屬性值作為屬性定義的一部分

2

3
計算屬性
- 本質(zhì)就是方法(函數(shù))
- 不占用實例的內(nèi)存
- 枚舉、結(jié)構(gòu)體、類都可以定義計算屬性(因為他們都能定義方法)
計算屬性初始值
- set傳入的新值默認叫做newValue,也可以自定義
- 只讀計算屬性:只有g(shù)et沒有set (不能只有set,編譯器會報錯)
- 定義計算屬性只能用var不能使用let
- 計算屬性的值是可能發(fā)生變化的(即使是只讀計算屬性)

自定義默認

只有g(shù)et
枚舉值rawValue原理
- 枚舉值原始值rawValue的本質(zhì)是:只讀計算屬性

枚舉
延遲存儲屬性
- 使用lazy可以定義一個延遲存儲屬性,在第一次用到屬性的時候才會進行初始化
- lazy屬性必須是
var不能是let(因為let要求初始化必須有值,所以不能與lazy一起使用)

延遲
延遲存儲屬性的注意點
- 如果多線程同時第一訪問lazy屬性
- 無法保證屬性只能被初始化一次
- 能夠使一些不需要第一時間加載的,在需要的時間再去調(diào)用
- 當結(jié)構(gòu)體包含一個延遲存儲屬性時,只要var才能訪問延遲屬性
- 因為延遲屬性初始化時需要改變結(jié)構(gòu)體的內(nèi)存,
// p.z調(diào)用的時候,去初始化z,去改變結(jié)構(gòu)體的內(nèi)存,但是p是let,是不允許的,若是為var ,則是可以修改。

注意點
屬性觀察器
- 可以為非
lazy的var``存儲屬性設置屬性觀察器 -
willSet會傳遞新值,默認叫newValue -
didSet會傳遞舊值,默認叫oldValue - 在初始化器中設置屬性值不會觸發(fā)
willSet和didSet - 在屬性定義時設置屬性值不會觸發(fā)
willSet和didSet

image.png
- 屬性觀察器、計算屬性的功能,同樣可以應用在全局變量、局部變量

Demo