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