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

edithfang發表於2015-01-28
在非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"  
    }  
}  
作者:王巍(@onevcat),iOS和Unity3D開發者。
相關閱讀
評論(1)

相關文章