swift學習之屬性

屬性

存儲屬性

存儲屬性就是一個存儲常量let或者變量var的屬性
存儲屬性有一個專屬技能lazy(延時加載或懶加載)
lazy必須與var=同時出現
lazy表達式 =右邊必須是一個常量(閉包的簡化)或者一個執行閉包
存儲屬性的標志let,=,lazy var,屬性表達式存在任何一個標志都是存儲屬性

class Person
{
     //存儲屬性
     let name:String = "小史"
     lazy var age:Int = 0
     var firstName:String?
    lazy var secondName:String = {
        return "hello" + "world"
    }()
}

計算屬性

計算型屬性通常依賴于其他屬性

計算屬性不直接存儲變量值,而是通過gettersetter方法來操作變量值getter取值,setter賦值
為了防止死循環計算屬性的gettersetter方法實現需要一個中間變量屬性來完成
計算屬性的getter方法是必須實現的,setter方法可以選擇實現
計算屬性如果只實現了getter方法,就是只讀屬性
計算屬性操作的是變量值,只能用var

class Person{
    private var _name:String?//中間變量屬性
    var name:String?{
        get{
            return _name
        }
        set{
            _name = newValue
        }
    }

   //只讀屬性實現,只讀屬性可以省略get關鍵字及一對{}
    var realName:String{
         print(_name)
         return _name
    }
}

類型屬性

類型屬性也區分計算屬性和存儲屬性
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也是不錯的選擇,個人感覺因為實現setter就必須實現getter,然而我們只需要的是setter,getter并沒有什么卵用,所以還不如直接寫在觀察器方法中更新UI
屬性的初始化不會觸發屬性觀察器

給當前類添加屬性觀察器

只能給lazy之外的存儲屬性添加屬性觀察器

var storedProperty:String?{
    //willSet默認攜帶newValue參數,當然參數名稱可以自行定義
    willSet
    {
        //更新UI
        print(newValue)
    }
    //didSet默認攜帶oldValue參數,當然參數名稱可以自行定義
    didSet
    {
        //更新UI
        print(oldValue)
    }
}

給繼承屬性添加屬性觀察器

子類可以給任何繼承而來的非let屬性添加屬性觀察器,包括全局屬性
只能通過override重寫屬性給繼承屬性添加屬性觀察器
重寫屬性必須明確屬性的類型,方便編譯器定位哪個屬性需要重寫

override var storedProperty:String?{
    //willSet默認攜帶newValue參數,當然參數名稱可以自行定義
    willSet
    {
        //更新UI,這里的newValue是將要賦給storedProperty的值,每次拿到的都是新值
        print(newValue)
    }
    //didSet默認攜帶oldValue參數,當然參數名稱可以自行定義
    didSet
    {
        //更新UI這里的oldValue是storedProperty賦新值前的值,第一次拿到的就是nil,可選類型為賦新值就是nil
        print(oldValue)
    }
}

重寫

重寫關鍵字override,子類可以重寫父類的函數或者屬性,這里著重討論重寫屬性,這里的重寫包括給繼承屬性添加(或者重寫)屬性觀察器和重寫屬性的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
    }
}

在方法或屬性定義關鍵字前面添加final關鍵字表明該屬性或者方法不能被重寫
在類定義前添加final關鍵字表明該類不能被繼承

全局變量

默認的swift中的全局變量都是延時加載的與實例屬性的懶加載屬性是相似的(但是并沒有顯式的lazy關鍵字)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容