閱讀476 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Swift靜態屬性

在介紹靜態屬性之前,我們先來看一個類的設計,有一個Account(銀行賬戶)類,假設它有3個屬性:amount(賬戶金額)、interestRate(利率)和owner(賬戶名)。在這3個屬性中,amount和owner會因人而異,不同的賬戶這些內容是不同的,而所有賬戶的interestRate都是相同的。
amount和owner屬性與賬戶個體有關,稱為實例屬性。interestRate屬性與個體無關,或者說是所有賬戶個體共享的,這種屬性稱為靜態屬性或類型屬性。
3種麵向對象類型(結構體、枚舉和類)都可以定義靜態屬性,它們的語法格式分別如下所示:
struct 結構體名 {               	①
    static var(或let) 存儲屬性  = "xxx"               	②
    ......
    static var 計算屬性名 : 屬性數據類型 {       	③
    get {       
        return 計算後屬性值  
    }
    set (新屬性值) {  
        ......
    }
    }
}


enum 枚舉名 {   				④
    static var(或let) 存儲屬性  = "xxx"              	⑤
    ......
    static var 計算屬性名 : 屬性數據類型 {       	⑥
    get {   
        return 計算後屬性值    
    }    
    set (新屬性值) {
        ......
    }     
    }
}


class 類名 {      			⑦
    ......
    class var 計算屬性名 : 屬性數據類型 {        	⑧
    get {
        return 計算後屬性值
    }   
    set (新屬性值) {  
        ......
    }  
    }
}

  
上述代碼中,第①行是定義結構體,結構體中可以定義靜態存儲屬性和計算屬性。第②代碼是定義靜態存儲屬性,聲明關鍵字是static,這個屬性可以是變量屬性,也可以是常量屬性。第③行代碼是定義靜態計算屬性,聲明使用的關鍵字是static,計算屬性不能為常量,這裏隻能是變量。結構體靜態計算屬性也可以是隻讀的,語法如下:
static var 計算屬性名 : 屬性數據類型 {
    return 計算後屬性值
}
第④行是定義枚舉,枚舉中不可以定義實例存儲屬性,但可以定義靜態存儲屬性,也可以定義靜態計算屬性。定義枚舉靜態屬性與定義結構體靜態屬性的語法完全一樣,這裏就不再贅述了。
第⑦行是定義類,類中可以定義實例存儲屬性,但不可以定義靜態存儲屬性。類中可以定義靜態計算屬性。聲明使用的關鍵字是class,這與結構體和枚舉的聲明不同。
我們對上述說明進行了歸納,見下表。
提示 在靜態計算屬性中不能訪問實例屬性(包括存儲屬性和計算屬性),但可以訪問其他靜態屬性。在實例計算屬性中能訪問實例屬性,也能訪問靜態屬性。
一、結構體靜態屬性
下麵我們先看一個Account結構體靜態屬性示例:
struct Account {
    
    var amount : Double = 0.0                 //賬戶金額
    var owner : String = ""                   //賬戶名
    
    static var interestRate : Double = 0.668  //利率	①


    static var staticProp : Double {	②
        return interestRate * 1_000_000
    }
    
    var instanceProp : Double {	③
        return Account.interestRate * amount
    }
}


//訪問靜態屬性
println(Account.staticProp)	④


var myAccount = Account()
//訪問實例屬性
myAccount.amount = 1_000_000	⑤
//訪問靜態屬性
println(myAccount.instanceProp)	⑥


上述代碼定義了Account結構體,其中第①行代碼定義了靜態存儲屬性interestRate,第②行代碼定義了靜態計算屬性staticProp,在其屬性體中可以訪問interestRate等靜態屬性。第③行代碼定義了實例計算屬性instanceProp,在其屬性體中能訪問靜態屬性interestRate,訪問方式為“類型名.靜態屬性”,如Account.interestRate。第④行代碼也是訪問靜態屬性,訪問方式也是“類型名.靜態屬性”。
第⑤行和第⑥行代碼是訪問實例屬性,訪問方式是“實例.實例屬性”。
二.枚舉靜態屬性
下麵我們先看一個Account枚舉靜態屬性示例:
enum Account {
    
    case 中國銀行				①
    case 中國工商銀行
    case 中國建設銀行
    case 中國農業銀行		②
    
    static var interestRate : Double = 0.668 //利率	③
    
    static var staticProp : Double {	④
        return interestRate * 1_000_000
    }
    
    var instanceProp : Double {	⑤
    
        switch (self) {	⑥
            case 中國銀行:
                Account.interestRate = 0.667
            case 中國工商銀行:
                Account.interestRate = 0.669
            case 中國建設銀行:
                Account.interestRate = 0.666
            case 中國農業銀行:
                Account.interestRate = 0.668
        }							⑦
        return Account.interestRate * 1_000_000	⑧
    }
}


//訪問靜態屬性
println(Account.staticProp)	⑨


var myAccount = Account.中國工商銀行
//訪問實例屬性
println(myAccount.instanceProp)	⑩


上述代碼定義了Account枚舉類型,其中第①~②行代碼定義了枚舉的4個成員。第③行代碼定義了靜態存儲屬性interestRate,第④行代碼定義了靜態計算屬性staticProp,在其屬性體中可以訪問interestRate等靜態屬性。第⑤行代碼定義了實例計算屬性instanceProp,其中第⑥~⑦行代碼使用switch語句判斷當前實例的值,獲得不同的利息,第⑥行代碼中使用了self,它指代當前實例本身。第⑧行代碼是返回計算的結果。
第⑨行代碼是訪問靜態屬性。第⑩行代碼是訪問實例屬性。
示例運行結果如下:
668000.0
669000.0
三、類靜態屬性
下麵我們先看一個Account類靜態屬性示例:
class Account {				①
    
    var amount : Double = 0.0               // 賬戶金額
    var owner : String = ""                 // 賬戶名
    
    var interestRate : Double = 0.668       // 利率	②


    class var staticProp : Double {	③
        return 0.668 * 1_000_000
    }
    
    var instanceProp : Double {	④
        return self.interestRate * self.amount	⑤
    }
}


//訪問靜態屬性
println(Account.staticProp)	⑥


var myAccount = Account()
//訪問實例屬性
myAccount.amount = 1_000_000
//訪問靜態屬性
println(myAccount.instanceProp)	⑦


上述代碼第①行定義了Account類,第②行代碼定義了存儲屬性interestRate,注意在類中不能定義靜態存儲屬性。第③行代碼定義了靜態計算屬性staticProp,關鍵字是class。第④行代碼定義了實例計算屬性instanceProp,在第⑤行代碼訪問實例屬性interestRate和amount,訪問當前對象的實例屬性可以在屬性前加“self.”,self指代當前實例本身。第⑥行代碼也是訪問靜態屬性。第⑦行代碼是訪問實例屬性。



更多內容請關注國內第一本Swift圖書《Swift開發指南》
本書交流討論網站:https://www.51work6.com/swift.php
歡迎加入Swift技術討論群:362298485

歡迎關注智捷iOS課堂微信公共平台


最後更新:2017-04-03 05:40:10

  上一篇:go Openlayers中layer介紹
  下一篇:go 如果可以的話毛貓先得專注思考