知識點總結:安全
一、存儲屬性閉包
struct Town{ let region = "South" //只讀屬性 var population = 5422 //讀寫屬性 }
二、惰性存儲屬性spa
對於屬性來講,惰性加載意味着屬性的值只在第一次訪問的時候纔會出現,所以lazy屬性必須聲明爲var。注意:標記爲lazy的屬性只會被計算一次。code
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 } }() }
解釋兩點:一、self.population中self重要性:這個閉包必須引用self才能在閉包內訪問到這個實例的population屬性;二、這個地方爲何要用惰性屬性:爲了讓閉包能安全地訪問self,編譯器必須知道self已經初始化完成了。把townSize標記爲lazy是告訴編譯器這個屬性不是建立self所必須的;若是它不存在,就應該在它第一次被訪問的時候建立。這就告訴編譯器:當閉包被調用時,self確定已經可用了。blog
三、計算屬性繼承
只讀計算屬性get
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 } } }
四、屬性觀察者it
屬性觀察者對於任何自定義的存儲屬性和任何繼承的屬性均可用。自定義的計算屬性不能用屬性觀察io
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)") } } }
五、類型屬性
類型屬性對於類型是通用的,他們的值在同類型實例間共享的。值類型(結構體和枚舉)既能夠有存儲類型屬性、也能夠有計算類型屬性,值類型的類型屬性以關鍵字static開頭。類也能夠有存儲類型屬性和計算類型屬性,語法上若是用static,則子類不能覆蓋父類的類屬性,若是用class關鍵字,子類能爲某個類屬性提供本身的實現。