Swift靜態屬性

在介紹靜態屬性以前,咱們先來看一個類的設計,有一個Account(銀行帳戶)類,假設它有3個屬性:amount(帳戶金額)、interestRate(利率)和owner(帳戶名)。在這3個屬性中,amount和owner會因人而異,不一樣的帳戶這些內容是不一樣的,而全部帳戶的interestRate都是相同的。
amount和owner屬性與帳戶個體有關,稱爲實例屬性。interestRate屬性與個體無關,或者說是全部帳戶個體共享的,這種屬性稱爲靜態屬性或類型屬性。
3種面向對象類型(結構體、枚舉和類)均可以定義靜態屬性,它們的語法格式分別以下所示:
php

[html] view plaincopyhtml

  1. struct 結構體名 {                   ①  swift

  2.     static var(或let) 存儲屬性  = "xxx"                  ②  微信

  3.     ......  網站

  4.     static var 計算屬性名 : 屬性數據類型 {         ③  spa

  5.     get {         .net

  6.         return 計算後屬性值    設計

  7.     }  rest

  8.     set (新屬性值) {    orm

  9.         ......  

  10.     }  

  11.     }  

  12. }  

  13.   

  14.   

  15. enum 枚舉名 {                  ④  

  16.     static var(或let) 存儲屬性  = "xxx"                  ⑤  

  17.     ......  

  18.     static var 計算屬性名 : 屬性數據類型 {         ⑥  

  19.     get {     

  20.         return 計算後屬性值      

  21.     }      

  22.     set (新屬性值) {  

  23.         ......  

  24.     }       

  25.     }  

  26. }  

  27.   

  28.   

  29. class 類名 {                  ⑦  

  30.     ......  

  31.     class var 計算屬性名 : 屬性數據類型 {          ⑧  

  32.     get {  

  33.         return 計算後屬性值  

  34.     }     

  35.     set (新屬性值) {    

  36.         ......  

  37.     }    

  38.     }  

  39. }  


  
上述代碼中,第①行是定義結構體,結構體中能夠定義靜態存儲屬性和計算屬性。第②代碼是定義靜態存儲屬性,聲明關鍵字是static,這個屬性能夠是變量屬性,也能夠是常量屬性。第③行代碼是定義靜態計算屬性,聲明使用的關鍵字是static,計算屬性不能爲常量,這裏只能是變量。結構體靜態計算屬性也能夠是隻讀的,語法以下:
static var 計算屬性名 : 屬性數據類型 {
    return 計算後屬性值
}
第④行是定義枚舉,枚舉中不能夠定義實例存儲屬性,但能夠定義靜態存儲屬性,也能夠定義靜態計算屬性。定義枚舉靜態屬性與定義結構體靜態屬性的語法徹底同樣,這裏就再也不贅述了。
第⑦行是定義類,類中能夠定義實例存儲屬性,但不能夠定義靜態存儲屬性。類中能夠定義靜態計算屬性。聲明使用的關鍵字是class,這與結構體和枚舉的聲明不一樣。
咱們對上述說明進行了概括,見下表。

提示 在靜態計算屬性中不能訪問實例屬性(包括存儲屬性和計算屬性),但能夠訪問其餘靜態屬性。在實例計算屬性中能訪問實例屬性,也能訪問靜態屬性。
1、結構體靜態屬性
下面咱們先看一個Account結構體靜態屬性示例:

[html] view plaincopy

  1. struct Account {  

  2.       

  3.     var amount : Double = 0.0                 //帳戶金額  

  4.     var owner : String = ""                   //帳戶名  

  5.       

  6.     static var interestRate : Double = 0.668  //利率  ①  

  7.   

  8.   

  9.     static var staticProp : Double {    ②  

  10.         return interestRate * 1_000_000  

  11.     }  

  12.       

  13.     var instanceProp : Double { ③  

  14.         return Account.interestRate * amount  

  15.     }  

  16. }  

  17.   

  18.   

  19. //訪問靜態屬性  

  20. println(Account.staticProp) ④  

  21.   

  22.   

  23. var myAccount = Account()  

  24. //訪問實例屬性  

  25. myAccount.amount = 1_000_000    ⑤  

  26. //訪問靜態屬性  

  27. println(myAccount.instanceProp) ⑥  



上述代碼定義了Account結構體,其中第①行代碼定義了靜態存儲屬性interestRate,第②行代碼定義了靜態計算屬性staticProp,在其屬性體中能夠訪問interestRate等靜態屬性。第③行代碼定義了實例計算屬性instanceProp,在其屬性體中能訪問靜態屬性interestRate,訪問方式爲「類型名.靜態屬性」,如Account.interestRate。第④行代碼也是訪問靜態屬性,訪問方式也是「類型名.靜態屬性」。
第⑤行和第⑥行代碼是訪問實例屬性,訪問方式是「實例.實例屬性」。
二.枚舉靜態屬性
下面咱們先看一個Account枚舉靜態屬性示例:

[html] view plaincopy

  1. enum Account {  

  2.       

  3.     case 中國銀行               ①  

  4.     case 中國工商銀行  

  5.     case 中國建設銀行  

  6.     case 中國農業銀行     ②  

  7.       

  8.     static var interestRate : Double = 0.668 //利率   ③  

  9.       

  10.     static var staticProp : Double {    ④  

  11.         return interestRate * 1_000_000  

  12.     }  

  13.       

  14.     var instanceProp : Double { ⑤  

  15.       

  16.         switch (self) { ⑥  

  17.             case 中國銀行:  

  18.                 Account.interestRate = 0.667  

  19.             case 中國工商銀行:  

  20.                 Account.interestRate = 0.669  

  21.             case 中國建設銀行:  

  22.                 Account.interestRate = 0.666  

  23.             case 中國農業銀行:  

  24.                 Account.interestRate = 0.668  

  25.         }                           ⑦  

  26.         return Account.interestRate * 1_000_000 ⑧  

  27.     }  

  28. }  

  29.   

  30.   

  31. //訪問靜態屬性  

  32. println(Account.staticProp) ⑨  

  33.   

  34.   

  35. var myAccount = Account.中國工商銀行  

  36. //訪問實例屬性  

  37. println(myAccount.instanceProp) ⑩  



上述代碼定義了Account枚舉類型,其中第①~②行代碼定義了枚舉的4個成員。第③行代碼定義了靜態存儲屬性interestRate,第④行代碼定義了靜態計算屬性staticProp,在其屬性體中能夠訪問interestRate等靜態屬性。第⑤行代碼定義了實例計算屬性instanceProp,其中第⑥~⑦行代碼使用switch語句判斷當前實例的值,得到不一樣的利息,第⑥行代碼中使用了self,它指代當前實例自己。第⑧行代碼是返回計算的結果。
第⑨行代碼是訪問靜態屬性。第⑩行代碼是訪問實例屬性。
示例運行結果以下:
668000.0
669000.0
3、類靜態屬性
下面咱們先看一個Account類靜態屬性示例:

[html] view plaincopy

  1. class Account {             ①  

  2.       

  3.     var amount : Double = 0.0               // 帳戶金額  

  4.     var owner : String = ""                 // 帳戶名  

  5.       

  6.     var interestRate : Double = 0.668       // 利率   ②  

  7.   

  8.   

  9.     class var staticProp : Double { ③  

  10.         return 0.668 * 1_000_000  

  11.     }  

  12.       

  13.     var instanceProp : Double { ④  

  14.         return self.interestRate * self.amount  ⑤  

  15.     }  

  16. }  

  17.   

  18.   

  19. //訪問靜態屬性  

  20. println(Account.staticProp) ⑥  

  21.   

  22.   

  23. var myAccount = Account()  

  24. //訪問實例屬性  

  25. myAccount.amount = 1_000_000  

  26. //訪問靜態屬性  

  27. println(myAccount.instanceProp) ⑦  



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



更多內容請關注國內第一本Swift圖書《Swift開發指南》

本書交流討論網站:http://www.51work6.com/swift.php

歡迎加入Swift技術討論羣:362298485

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

相關文章
相關標籤/搜索