【Swift】staticで1つのインスタンスを共有

 

 

解説

 

全ファイルで変数や値を共有したくありませんか?

 

クラスのインスタンスって基本的に生成したファイル内でしか使えません。

 

関数やメソッドなら、渡したい引数さえ用意すれば、後は処理や返り値を返してくれるので、必要な時にインスタンスを作ればいいだけです。

 

しかし、変数の場合はどうでしょうか?

 

インスタンスは1つ1つが別物なので、別のファイルで使うには、逐一渡し続ける必要があります。

 

例えば、インスタンスAを他のファイルで使う場合、関数などで渡します。

f:id:nekokichi_yos2:20190401141700p:plain

 

ですが、もし何十個ものファイルで使う場合、

  • 常に保持し続けないといけない
  • 今現在の変数や値の状態が把握できない
  • 余計にコードが増える

などの弊害が起こります。

f:id:nekokichi_yos2:20190401141638p:plain

 

そこで、使いたいインスタンスを1つのファイルに固定させ、必要なときに呼び出せれば、わざわざ遷移先に渡す必要などありません。

 

お金の管理に例えると、

  • 毎日ランダムで選んだ社員に任せる

ではなく

  • 1つの銀行口座に任せる

です。

f:id:nekokichi_yos2:20190401141526p:plain

 

オリジナルアプリ開発でFirebaseを使った際、どこからでもアクセスできるインスタンスがあれば、新たにデータを取得/編集/保存する際、わざわざバケツリレーしなくても、必要な時に参照するだけでいいのでめっちゃ楽でした。

 

それでは、staticを使った共有インスタンスを使い方を紹介します。

 

ストーリーボード

 

今回は、

  • 画面起動時に初期値と変更後の値
  • 遷移後に現在の値と変更後の値

を表示します。

 

f:id:nekokichi_yos2:20190331174346p:plain

 

ソースコード

 

「呼び出される側」

class object: NSObject {
    //頭にstatic
    //現クラスのインスタンスを代入
    static let instance = object()
    var number = 0
    var string = "a"
}

 

「呼び出す側 - ViewController」

class ViewController: UIViewController {
    
    //object.swift
    let sample = object.instance

    override func viewDidLoad() {
        super.viewDidLoad()
        //インスタンスの初期値
        print("\(sample.number) " + sample.string)
        //値を変更
        sample.number = 100
        sample.string = "string"
        //変更した値を表示
        print("\(sample.number) " + sample.string)
    }

}

 

「呼び出す側 - ViewController2」

class ViewController2: UIViewController {

    //object.swift
    let sample = object.instance
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //インスタンスの初期値
        print("\(sample.number) " + sample.string)
        //値を変更
        sample.number = 777
        sample.string = "end"
        //変更した値を表示
        print("\(sample.number) " + sample.string)
    }
}

 

 

出力結果

f:id:nekokichi_yos2:20190401141114p:plain

1,2行目がViewController、

3,4行目がViewController2、での出力結果。