swift:Swiftでのstaticとclassの使用


Swiftで「タイプ範囲役割ドメイン」を表す概念にはstaticとclassの2つの異なるキーワードがあります.この2つのキーワードは確かにこの意味を表していますが、Objective-Cを含む他の言語では、変数/クラスメソッドや静的変数/静的関数を特に分類することはありません.しかし、Swiftでは、この2つのキーワードを混同することはできません.
非classのタイプコンテキストでは、staticを使用してタイプの役割ドメインを記述します.これには、enumおよびstructでタイプメソッドおよびタイププロパティを記述する場合が含まれます.この2つの値タイプでは、タイプ範囲内でストレージ属性、計算属性、メソッドを宣言して使用できます.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"  
    }  
}