😎

[Swift]staticについて調べてもぱっとしなかったので自分でまとめた[静的変数/静的メソッド]

2022/04/24に公開

staticとはどういう時に書かれるのか

静的変数についてまず書いていきます。

static var は「静的変数」と呼ばれるもので、全てのプログラムが終了するまで一貫してその値を保持し続ける変数

こちらの例えが秀逸でしたのでそのまま引用します。
例えば、ラーメン屋さんの券発見システムだとします。
すべてのオーダー数を1日の終りに集計する、そのお客さんの注文数をカウントする(何皿など)。

static(静的)と動的変数の挙動から差異を学んでいきましょう。

class noodle {
    
    //本日のオーダー数
    static var order = 0
    
    //お客が替え玉した時の皿の数
    var sara = 0
    
    
    //売上をカウントしていく
    func uriage() {
        
        noodle.order += 1
        print("本日\(noodle.order)杯目の注文が入りました。")
    }
    
    
    //お客ごとの替え玉数をカウント
    func kaedama() {
        
        sara += 1
        print("替え玉を\(sara)回したので皿は\(sara)枚です。")
    }
}

それで以下のように呼び出したらどうなるのでしょうか。

var okyakusan_1 = noodle()
okyakusan_1.uriage()
// ▶ 本日1杯目の注文が入りました。

okyakusan_1.kaedama()
// ▶︎ 替え玉を1回したので皿は1枚です。

2回目は以下のようになります。

var okyakusan_2 = noodle()
okyakusan_2.uriage()
// ▶ 本日1杯目の注文が入りました。

okyakusan_2.kaedama()
// ▶︎ 替え玉を2回したので皿は2枚です。

つまり、クラス(noodleクラス)を初期化してインスタンスを生成しても、
再度インスタンスが生成されない変数と言えます。

もっと細かい話をすると、以下で参照できるという性質を持ちます。

print(noodle.sara) // インスタンスがないので不可
print(noodle().sara) // インスタンス生成すればOK  // 結果:0

静的変数はインスタンスを生成する必要がなく、参照できる。
print(noodle.order) // 結果:0

参考:静的変数

https://fuuno.net/swift/static/static.html

静的なメソッドについて

staticはメソッドにつけることもできます。

class noodle {

    func getResponce(isSuccess: Bool) ->  String{
        if (isSuccess) {
            return "Success"
        } else {
            return "Failed"
        }
    }
    
    static func getResponceStaticMethod(isSuccess: Bool) ->  String{
        if (isSuccess) {
            return "Success"
        } else {
            return "Failed"
        }
    }
}

staticをつけたメソッドが存在しますが、以下のような挙動の違いがあります。

noodle().getResponce(isSuccess: true)
noodle.getResponceStaticMethod(isSuccess: true)

noodleクラスのインスタンスを生成せずに、呼び出して値を返却することができます。

Discussion