swift: Swift中static和class的使用

來源:互聯網
上載者:User

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

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

struct Point {      let x: Double      let y: Double      // 儲存屬性      static let zero = Point(x: 0, y: 0)      // 計算屬性      static var ones: [Point] {          return [Point(x: 1, y: 1),                  Point(x: -1, y: 1),                  Point(x: 1, y: -1),                  Point(x: -1, y: -1)]      }      // 類型方法      static func add(p1: Point, p2: Point) -> Point {          return Point(x: p1.x + p2.x, y: p1.y + p2.y)      }  }  

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

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

class MyClass {      class var bar: Bar?  }  

編譯時間會得到一個錯誤:

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:

protocol MyProtocol {      class func foo() -> String  }  struct MyStruct: MyProtocol {      static func foo() -> String {          return "MyStruct"      }  }  enum MyEnum: MyProtocol {      static func foo() -> String {          return "MyEnum"      }  }  class MyClass: MyProtocol {      class func foo() -> String {          return "MyClass"      }  }  


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.