Swiftの型メソッドや型プロパティー(クラスメソッドやクラス変数のようなもの)を作る際はclassかstaticを使います。
この2つの挙動の違いをまとめてみました。
class MyClass {
static var value = ""
static func method() {}
}
_ = MyClass.value
MyClass.method()
struct/enum
メソッド/プロパティーの両方に言えますが、structとenumではclassを使う事ができません。
structとenumではstaticを使う必要があります。
struct MyStruct {
static var staticProperty: String { return "" }
class var classProperty: String { return "" } // エラー
static func staticMethod() {}
class func classMethod() {} // エラー
}
enum MyEnum {
static var staticProperty: String { return "" }
class var classProperty: String { return "" } // エラー
static func staticMethod() {}
class func classMethod() {} // エラー
}
型メソッド
通常の宣言と実行では差異なく使えます。
class MyClass {
static func staticMethod() {}
class func classMethod() {}
}
MyClass.staticMethod()
MyClass.classMethod()
staticはオーバーライドできないという制限があります。
class MyClass {
static func staticMethod() {}
class func classMethod() {}
}
class SubClass: MyClass {
override static func staticMethod() {} // エラーになる
override class func classMethod() {}
}
クラス変数
classはclass let classProperty = ""
のようなStored Property
で使う事ができません。
class MyClass {
static let staticProperty = ""
class let classProperty = "" // エラーになる
}
Computed Property
はどちらでも使えます。
class MyClass {
static var staticProperty: String { return "" }
class var classProperty: String { return "" }
}
staticはメソッド同様にオーバーライドできません。
class MyClass {
static var staticProperty = ""
class var classProperty = ""
}
class SubClass: MyClass {
override static var staticProperty = "" // エラー
override class var classProperty = ""
}
相互の呼び出し
classとstaticは相互に呼び出す事ができます。
class → static へのアクセス
class MyClass {
static var staticProperty: String { return "" }
static func staticMethod() {}
class func classMethod() {
print(staticProperty)
staticMethod()
}
}
static → class へのアクセス
class MyClass {
class var classProperty: String { return "" }
class func classMethod() {}
static func staticMethod() {
print(classProperty)
classMethod()
}
}
まとめ
表にしてみました。
static | class | |
---|---|---|
オーバーライド | できない | できる |
struct/enum | 使える | 使えない |
Stored Property | 使える | 使えない |
機能的なところはまとめたのですが、内部的な動きやどう使い分けたら良いかはまだ分かってないので後々勉強していこうと思います。