Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away