在介紹靜態屬性以前,咱們先來看一個類的設計,有一個Account(銀行帳戶)類,假設它有3個屬性:amount(帳戶金額)、interestRate(利率)和owner(帳戶名)。在這3個屬性中,amount和owner會因人而異,不一樣的帳戶這些內容是不一樣的,而全部帳戶的interestRate都是相同的。
amount和owner屬性與帳戶個體有關,稱爲實例屬性。interestRate屬性與個體無關,或者說是全部帳戶個體共享的,這種屬性稱爲靜態屬性或類型屬性。
3種面向對象類型(結構體、枚舉和類)均可以定義靜態屬性,它們的語法格式分別以下所示:
php
[html] view plaincopyhtml
struct 結構體名 { ① swift
static var(或let) 存儲屬性 = "xxx" ② 微信
...... 網站
static var 計算屬性名 : 屬性數據類型 { ③ spa
get { .net
return 計算後屬性值 設計
} rest
set (新屬性值) { orm
......
}
}
}
enum 枚舉名 { ④
static var(或let) 存儲屬性 = "xxx" ⑤
......
static var 計算屬性名 : 屬性數據類型 { ⑥
get {
return 計算後屬性值
}
set (新屬性值) {
......
}
}
}
class 類名 { ⑦
......
class var 計算屬性名 : 屬性數據類型 { ⑧
get {
return 計算後屬性值
}
set (新屬性值) {
......
}
}
}
上述代碼中,第①行是定義結構體,結構體中能夠定義靜態存儲屬性和計算屬性。第②代碼是定義靜態存儲屬性,聲明關鍵字是static,這個屬性能夠是變量屬性,也能夠是常量屬性。第③行代碼是定義靜態計算屬性,聲明使用的關鍵字是static,計算屬性不能爲常量,這裏只能是變量。結構體靜態計算屬性也能夠是隻讀的,語法以下:
static var 計算屬性名 : 屬性數據類型 {
return 計算後屬性值
}
第④行是定義枚舉,枚舉中不能夠定義實例存儲屬性,但能夠定義靜態存儲屬性,也能夠定義靜態計算屬性。定義枚舉靜態屬性與定義結構體靜態屬性的語法徹底同樣,這裏就再也不贅述了。
第⑦行是定義類,類中能夠定義實例存儲屬性,但不能夠定義靜態存儲屬性。類中能夠定義靜態計算屬性。聲明使用的關鍵字是class,這與結構體和枚舉的聲明不一樣。
咱們對上述說明進行了概括,見下表。
提示 在靜態計算屬性中不能訪問實例屬性(包括存儲屬性和計算屬性),但能夠訪問其餘靜態屬性。在實例計算屬性中能訪問實例屬性,也能訪問靜態屬性。
1、結構體靜態屬性
下面咱們先看一個Account結構體靜態屬性示例:
[html] view plaincopy
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枚舉靜態屬性示例:
[html] view plaincopy
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
3、類靜態屬性
下面咱們先看一個Account類靜態屬性示例:
[html] view plaincopy
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開發指南》
本書交流討論網站:http://www.51work6.com/swift.php
歡迎加入Swift技術討論羣:362298485
歡迎關注智捷iOS課堂微信公共平臺