swift 裏的class和static

Swift開發必備技巧:static和class的使用

發表於2015-01-28 14:12|8480次閱讀| 來源Swifter|7 條評論| 作者王巍
摘要:Swift中表示“類型範圍作用域”這一概念有着兩個不同的關鍵字,分別爲static和class,而在OC等其他語言中,開發者不會特地區分變量/類方法和靜態變量/靜態函數。本文作者王巍在這篇Tip中詳解了static和class的使用。

Swift中表示 “類型範圍作用域” 這一概念有兩個不同的關鍵字,它們分別是static和class。這兩個關鍵字確實都表達了這個意思,但是在其他一些語言,包括Objective-C中,我們並不會特別地區分類變量/類方法和靜態變量/靜態函數。但是在Swift中,這兩個關鍵字卻是不能用混的。

在非class的類型上下文中,我們統一使用static來描述類型作用域。這包括在enum和struct中表述類型方法和類型屬性時。在這兩個值類型中,我們可以在類型範圍內聲明並使用存儲屬性,計算屬性和方法。static適用的場景有這些:

  1. struct Point {  
  2.     let x: Double  
  3.     let y: Double  
  4.     // 存儲屬性  
  5.     static let zero = Point(x: 0, y: 0)  
  6.     // 計算屬性  
  7.     static var ones: [Point] {  
  8.         return [Point(x: 1, y: 1),  
  9.                 Point(x: -1, y: 1),  
  10.                 Point(x: 1, y: -1),  
  11.                 Point(x: -1, y: -1)]  
  12.     }  
  13.     // 類型方法  
  14.     static func add(p1: Point, p2: Point) -> Point {  
  15.         return Point(x: p1.x + p2.x, y: p1.y + p2.y)  
  16.     }  
  17. }  

enum的情況與這個十分類似,就不再列舉了。

class關鍵字相比起來就明白許多,是專門用在class類型的上下文中的,可以用來修飾類方法以及類的計算屬性。要特別注意class中現在是不能出現存儲屬性的,我們如果寫類似這樣的代碼的話:

  1. class MyClass {  
  2.     class var bar: Bar?  
  3. }  

編譯時會得到一個錯誤:

class variables not yet supported

這主要是因爲在Objective-C中就沒有類變量這個概念,爲了運行時的統一和兼容,暫時不太方便添加這個特性。Apple表示今後將會考慮在某個升級版本中實裝class類型的類存儲變量,現在的話,我們只能在class中用class關鍵字聲明方法和計算屬性。

有一個比較特殊的是protocol。在Swift中class、struct和enum都是可以實現protocol的。那麼如果我們想在protocol裏定義一個類型域上的方法或者計算屬性的話,應該用哪個關鍵字呢?答案是使用class進行定義,但是在實現時還是按照上面的規則:在class裏使用class關鍵字,而在struct或enum中仍然使用static——雖然在protocol中定義時使用的是class:

  1. protocol MyProtocol {  
  2.     class func foo() -> String  
  3. }  
  4. struct MyStruct: MyProtocol {  
  5.     static func foo() -> String {  
  6.         return "MyStruct"  
  7.     }  
  8. }  
  9. enum MyEnum: MyProtocol {  
  10.     static func foo() -> String {  
  11.         return "MyEnum"  
  12.     }  
  13. }  
  14. class MyClass: MyProtocol {  
  15.     class func foo() -> String {  
  16.         return "MyClass"  
  17.     }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章