LoginSignup
203
172

More than 5 years have passed since last update.

【Swift】classとstaticの挙動の違いを整理する

Last updated at Posted at 2015-12-06

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 使える 使えない

機能的なところはまとめたのですが、内部的な動きやどう使い分けたら良いかはまだ分かってないので後々勉強していこうと思います。

203
172
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
203
172