swift之屬性

知識點總結:安全

一、存儲屬性閉包

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關鍵字,子類能爲某個類屬性提供本身的實現。

相關文章
相關標籤/搜索