【Swift】『static』キーワードの意味・便利な使い方

公開日: 

static とは

staticキーワードは簡単にいうと

インスタンスではなく、クラス単位で参照できるプロパティやメソッドを定義できるキーワード

です。試しにコードを書いてみます。

サンプルコード

sample.swift
class Hoge {

    // 普通のプロパティ
    var normalProperty: String = "normalProperty"

    // staticプロパティ
    static var staticProperty: String = "staticProperty"

    // 普通のメソッド
    func normalMethod() {
        print("normalMethod")
    }

    // staticメソッド
    static func staticMethod() {
        print("staticMethod")
    }
}

print(Hoge.normalProperty) // error

print(Hoge.staticProperty) // "staticProperty"

// インスタンス化
let hoge = Hoge()

print(hoge.normalProperty) // "normalProperty"

print(hoge.staticProperty) // error

このように、

クラス内に定義したプロパティやメソッドはそのクラスをインスタンス化してから、インスタンスを通して使用します。

それに対してstaticキーワードのついたプロパティやメソッドはインスタンスではなく、クラスに直接結びついています。

言い換えれば、インスタンス化しなくても使用できるプロパティやメソッドを定義できます。

static の良さ、使い所

static はわかったけどいつ使うん?

自分が、調べたりインターン先のソースコードを読んだ感じだと

  • インスタンス化しなくてもいい
  • 便利な関数をまとめることができる

の二つが挙げられるのではないかと思っています。

詳しくみていきましょう。

インスタンス化しなくてもいい

先ほど説明したように、staticがついているプロパティやメソッドはクラスをインスタンス化しなくても使用することができます。

すなわち、メモリを無駄に使用するミスを減らせます。

便利な関数をまとめることができる

これは自分がインターン先のアプリのソースコードを見ていて、一番納得した使い方です。

例えばアプリを作る中で、

  • Date 型から String 型に変換できるメソッド
  • String 型から Date 型に変換できるメソッド
  • Date 型の誕生日を引数に入れたら、Int 型の年齢が返ってくるメソッド

こんなメソッドたちが欲しいなって思ったとしましょう。

これはstaticを使ってこのように書いて、呼び出すことができます。

sample.swift
class DateUtility {
    // DateからStringに変換するstaticメソッド
    static func dateToString(date: Date) -> String {
        // 変換する処理
        return "string"
    }

    // StringからDateに変換するstaticメソッド
    static func stringToDate(stirng: String) -> Date {
        // 変換する処理
        return Date()
    }

    // 誕生日から年齢を返すstaticメソッド
    static func ageFromBirthday(birthday: Date) -> Int {
        // 年齢を計算する処理
        return Int()
    }
}

// 呼び出し
let today = DateUtility.dateToString(date: Date())
print(today)

関数の中の細かい処理は省略していますが、自分でDateUtilityクラスを作ることで Date 関連のよく使う関数をまとめることができそうです。

定義も呼び出しもわかりやすいですね。

メソッドを使いたいだけなので、インスタンス化する必要もなくstaticメソッドが適していそうです。

まとめ

static キーワードはクラスをインスタンス化しなくても、使用できるプロパティやメソッドを定義できる。

これは僕が調べたり、ソースコードを読んで学んだことなのでもっと便利な使い方や、もしかしたら間違いがあるかもしれません。

そういうことがあったら指摘していただけるとありがたいです。

では、Bye