標籤:pos 類型 ret enum 總結 實值型別 static ids 知識點
知識點總結:
1、儲存屬性
struct Town{ let region = "South" //唯讀屬性 var population = 5422 //讀寫屬性}
2、惰性儲存屬性
對於屬性來說,惰性載入意味著屬性的值只在第一次訪問的時候才會出現,因此lazy屬性必須聲明為var。注意:標記為lazy的屬性只會被計算一次。
struct Town{ let region = "South" //唯讀屬性 var population = 5422 //讀寫屬性 enum Size { case small case middle case large } lazy var townSize:Size = { switch self.population { case 0...10000: return Size.small case 10001...100000: return Size.middle default: return Size.large } }()}
解釋兩點:1、self.population中self重要性:這個閉包必須引用self才能在閉包內訪問到這個執行個體的population屬性;2、這個地方為什麼要用惰性屬性:為了讓閉包能安全地訪問self,編譯器必須知道self已經初始化完成了。把townSize標記為lazy是告訴編譯器這個屬性不是建立self所必須的;如果它不存在,就應該在它第一次被訪問的時候建立。這就告訴編譯器:當閉包被調用時,self肯定已經可用了。
3、計算屬性
唯讀計算屬性
struct Town{ var population = 2300}class Monster{ var name = "Monster" var town:Town? var victimPool:Int{ get{ return town?.population ?? 0 } } }
可讀寫計算屬性
struct Town{ var population = 2300}class Monster{ var name = "Monster" var town:Town? var victimPool:Int{ get{ return town?.population ?? 0 } set{ town?.population = newValue } } }
4、屬性觀察者
屬性觀察者對於任何自訂的儲存屬性和任何繼承的屬性都可用。自訂的計算屬性不能用屬性觀察
struct Town{ var population = 2300 { willSet{ print("The population will change from \(population) to \(newValue)") } didSet{ print("The population has changed from \(oldValue) to \(population)") } }}
5、類型屬性
類型屬性對於類型是通用的,他們的值在同類型執行個體間共用的。實值型別(結構體和枚舉)既可以有儲存類型屬性、也可以有計算類型屬性,實值型別的類型屬性以關鍵字static開頭。類也可以有儲存類型屬性和計算類型屬性,文法上如果用static,則子類不能覆蓋父類的類屬性,如果用class關鍵字,子類能為某個類屬性提供自己的實現。
swift之屬性