屬性
存儲屬性
存儲屬性就是一個存儲常量let
或者變量var
的屬性
存儲屬性有一個專屬技能lazy(延時加載或懶加載)
lazy
必須與var
和=
同時出現(xiàn)
lazy
表達式 =
右邊必須是一個常量(閉包的簡化)
或者一個執(zhí)行閉包
存儲屬性的標志let
,=
,lazy var
,屬性表達式存在任何一個標志都是存儲屬性
class Person
{
//存儲屬性
let name:String = "小史"
lazy var age:Int = 0
var firstName:String?
lazy var secondName:String = {
return "hello" + "world"
}()
}
計算屬性
計算型屬性通常依賴于其他屬性
計算屬性不直接存儲變量值颜价,而是通過getter
和setter
方法來操作變量值
,getter取值
瀑粥,setter賦值
為了防止死循環(huán)計算屬性的getter
和setter
方法實現(xiàn)需要一個中間變量屬性
來完成
計算屬性的getter方法是必須實現(xiàn)的
台汇,setter方法可以選擇實現(xiàn)
計算屬性如果只實現(xiàn)了getter方法砾淌,就是只讀屬性
計算屬性操作的是變量值
即纲,只能用var
class Person{
private var _name:String?//中間變量屬性
var name:String?{
get{
return _name
}
set{
_name = newValue
}
}
//只讀屬性實現(xiàn)具帮,只讀屬性可以省略get關鍵字及一對{}
var realName:String{
print(_name)
return _name
}
}
類型屬性
類型屬性也區(qū)分計算屬性和存儲屬性
static
修飾的既可以是計算屬性
也可以是存儲屬性
class
修飾的屬性只能是計算屬性
需要在子類當中重寫的類型屬性,必須使用class
修飾低斋,這里的重寫包括添加屬性觀察器
永遠不要用用lazy
修飾一個類型屬性(lazy是存儲屬性的專屬但是默認存儲類型屬性本身就是lazy的)
出過以上三條其余參照上面實例屬性
class Person{
static var firstName = "小史"
private static var _secondName = "??"
class var secondName:String{
get{
return _secondName
}
set{
_secondName = newValue
}
}
}
屬性觀察器
屬性觀察器最常用的方式就是在屬性觀察器方法中更新UI蜂厅,當然像OC一樣在setter方法中更新UI也是不錯的選擇,個人感覺因為實現(xiàn)setter就必須實現(xiàn)getter膊畴,然而我們只需要的是setter掘猿,getter并沒有什么卵用,所以還不如直接寫在觀察器方法中更新UI
屬性的初始化不會觸發(fā)屬性觀察器
給當前類添加屬性觀察器
只能給lazy
之外的存儲屬性添加屬性觀察器
var storedProperty:String?{
//willSet默認攜帶newValue參數(shù)唇跨,當然參數(shù)名稱可以自行定義
willSet
{
//更新UI
print(newValue)
}
//didSet默認攜帶oldValue參數(shù)稠通,當然參數(shù)名稱可以自行定義
didSet
{
//更新UI
print(oldValue)
}
}
給繼承屬性添加屬性觀察器
子類可以給任何繼承而來的非let
屬性添加屬性觀察器衬衬,包括全局屬性
只能通過override
重寫屬性給繼承屬性添加屬性觀察器
重寫屬性必須明確屬性的類型,方便編譯器定位哪個屬性需要重寫
override var storedProperty:String?{
//willSet默認攜帶newValue參數(shù)改橘,當然參數(shù)名稱可以自行定義
willSet
{
//更新UI滋尉,這里的newValue是將要賦給storedProperty的值,每次拿到的都是新值
print(newValue)
}
//didSet默認攜帶oldValue參數(shù)唧龄,當然參數(shù)名稱可以自行定義
didSet
{
//更新UI這里的oldValue是storedProperty賦新值前的值兼砖,第一次拿到的就是nil奸远,可選類型為賦新值就是nil
print(oldValue)
}
}
重寫
重寫關鍵字override
既棺,子類可以
重寫父類的函數(shù)或者屬性,這里著重討論重寫屬性懒叛,這里的重寫包括給繼承屬性添加(或者重寫)屬性觀察器和重寫屬性的setter和getter方法
子類可以給任何繼承而來的非let
屬性重寫(添加)屬性觀察器和getter丸冕,setter方法,包括計算屬性和存儲屬性
在寫setter和getter的時候薛窥,可以將一個集成來的只讀屬性胖烛,重寫寫成一個讀寫屬性,但是不能將一個讀寫屬性重寫成一個只讀屬性诅迷,就像不能將一個float值賦給一個double型佩番,但是不能把一個double型賦值給一個float型一樣,會截斷
private var _storedProperty:String? = "屬性"
override var storedProperty:String?{
get
{
return _storedProperty
}
set
{
_storedProperty = oldValue
}
}
在方法或?qū)傩远x關鍵字前面添加final關鍵字表明該屬性或者方法不能被重寫
在類定義前添加final關鍵字表明該類不能被繼承
全局變量
默認的swift中的全局變量都是延時加載的與實例屬性的懶加載屬性是相似的(但是并沒有顯式的lazy關鍵字)