標籤:swift enum 執行個體方法和類型方法
大家對“執行個體方法和類型方法”的概念應該不陌生了,在objective-c中很常見。例如:
1. 執行個體方法(減號開頭)
- (instancetype)init;
調用的時候,必須先進行執行個體化一個對象(alloc), 然後調用init方法。
2. 類型方法(加號開頭)
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
調用的時候,直接使用UIView的類型就可以了。
而在Swift中寫法有所改變,它使用class和static關鍵字來標示。而且不僅僅是作用在類中,枚舉和結構體(enum, struct)中也有相應的方法。
在class類型上下文中,我們使用class;其他的使用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) }}let p = Point(x: 3, y: 4)Point.zeroPoint.onesPoint.add(Point(x: 1, y: 2), p2: Point(x: 2, y: 1))
可以看到,在結構中,我們可以在其屬性或者方法前面加static進行修飾,調用的時候,直接可以通過類型名稱"Point"
點 出對應的屬性或者方法。
二、作用於類
class Square { // 類型屬性,用class關鍵字 class var PI: Double{ return 3.14 }}
可以看到,在類中,我們可以在其屬性或者方法前面加class進行修飾,調用的時候,直接Square.PI 就可以了。 代碼中是對“計算屬性”進行了class修飾。而這裡的計算屬性只是簡寫,我們也可以寫成下面的方式:
class Square { class var PI: Double{ get { return 3.14 } }}
但需要注意的是,儲存屬性不能使用class進行修飾。
class Student { class var phone: String?}
編譯後會報錯:“class variables not yet supported”
而用static就可以了。
class Student { static var phone: String?}
三、作用於協議
protocol MyProtocol { static func foo() -> String}struct MyStruct: MyProtocol { static func foo() -> String { return "MyStruct" }}class MyClass { class func foo() -> String { return "MyClass" }}
可以看出,在protocol中定義的屬性或者方法,是在其前面加上static修飾符的,但問題來了, 實現協議有可能是結構體或者枚舉,也有可能是類。那實現體中應該使用什麼修飾符?通過觀察上面的寫法可以看出:
在protocol中定義的方法或者計算屬性,類型修飾符是static;在實現的結構或者枚舉中,修飾符使用static,在實現的class中,修飾符使用class。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Swift:執行個體方法和類型方法