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

Swiftのstatic、classキーワードの違いについて

More than 1 year has passed since last update.

概要

Swiftのスタティック、クラスプロパティの違いについてまとめました。
※スタティック、クラスメソッドについても違いは基本的に同じです。

Swiftのスタティック、クラスプロパティの違い

名称

  • スタティックプロパティ(別名:静的プロパティ)
  • クラスプロパティ

上記両方をタイププロパティ(型プロパティ)と呼ぶ場合や、
スタティックプロパティのみを指してタイププロパティと呼ぶ場合あり

用途

  • 後述の特徴の違いはあるが、全インスタンスから共通で利用されるという点では同様
  • インスタンスに依存しないユーティリティ的な用途やシングルトンパターンで利用
シングルトンパターンの例
class Singleton {
    class var sharedInstance : Singleton {
        struct Static {
            static let instance : Singleton = Singleton()
        }
        return Static.instance
    }
}

定義方法

  • static、classキーワードを宣言の前に付与する
  • インスタンスのように初期化されないため、宣言時に初期値が必要
  • クラスプロパティは構造体(struct)、列挙型では定義不可、クラスでのみ定義可
  • クラスプロパティはストアドプロパティとしては定義不可(コンピューテッドプロパティのみ可)
// スタティックプロパティ
static let id: Int = 2017
static var name: String = "Qiita"

// クラスプロパティ
class let id: Int = 2017
class var name: String {
    return "Qiita"
}

利用方法

  • 型名.プロパティ名で同じようにアクセスできる
  • スタティック、クラスメソッドの内部では型名.は省略可(もしくはself.プロパティ名)
// スタティック、クラスプロパティで同様
func instanceMethod() {
    print(StructName.propertyName)
    print(EnumName.propertyName)
    print(ClassName.propertyName)
}

static func staticMethod(name: String) {
    print(self.name) // 引数と区別する時はself.
}

class func classMethod(name: String) {
    print(self.name) // 引数と区別する時はself.
}

特徴

  • サブクラスでオーバーライド(上書き)したい場合はクラスプロパティ一択
  • ストアドプロパティとして定義したい場合はスタティックプロパティ一択
比較項目 スタティック
プロパティ
クラス
プロパティ
オーバーライド NG OK
ストアドプロパティの定義 OK NG
コンピューテッド
プロパティの定義
OK OK

参考

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