LoginSignup
7
4

More than 3 years have passed since last update.

【swift】singleton(シングルトン)とその代替案について

Last updated at Posted at 2020-05-22

はじめに

今回は、シングルトンについて書いていこうと思います!
シングルトンとはなんぞやと言うところから、シングルトンを使う場面やメリットについて公式ドキュメントを元に書いていきます!

公式doc:Managing a Shared Resource Using a Singleton

共有リソースの管理者:シングルトン

公式ドキュメントのタイトルにある通り、シングルトンは共有リソースにアクセスします。
ざっくり言えば、インスタンス内の値を変更後、別のインスタンスを生成しても前者のインスタンスの更新内容が反映されるどういった処理が可能になります。

つまり、インスタンスが1個しか生成されないことを保証します。

イメージとしては、こちらの記事がとても参考になるので一読をお勧めします!
シングルトンについて swift

まず、コードでみていきます!

class single {
    var name = "singletonのお勉強"
    static let singleton = single()  //staticキーワードでsingle()をsingletonに代入
    private init(){}
}

var test = single.singleton  //最初のインスタンス
print(test.name)  //出力:singletonのお勉強
test.name = "singleton実装"

let singleton = single.singleton  //値更新後のインスタンス
print(singleton.name)  //出力:singleton実装

見ての通り、static let singleton = single() の部分でsingletonを作ります。
そうすることで、複数のスレッドで同時アクセスされた場合でも、1回だけ遅延して初期化されることが保証されます。

また、初期化以外の設定を実行する必要がある場合は、以下のようにクロージャーを用いることもあります。

class singleton{
  static let sharedInstance: singleton = {
    let instance = singleton()
    //追加設定処理
    return instance
   }()
}

シングルトンの使う場面

この機能についてはおおよそわかったが、では一体どのような場面でシングルトンを使うのだろうか、、

Swift におけるシングルトン・staticメソッドとの付き合い方

こちらの記事によると、

  • delegateにシングルトンインスタンスしか渡せない場合
  • インスタンスメソッド実装が必要な既存のプロトコルに準拠させたい場合
  • その他、大体の場合staticプロパティ・メソッドを束ねたstructで代用できる

え、singleton使う場面、めっちゃ少ないやん

この記事の筆者曰く、swiftの場合、singletonの実装が簡単なので必要なくても使ってもいいのではと。

シングルトンは大抵、staticプロパティ・メソッドを束ねたstructで代用できる

実際にコードで見ていきます



struct MyStruct{
  private init(){}
  static var value = "original"
  static func foo() { print("foo") }
}

var myStruct = MyStruct.self
myStruct.foo()

myStruct.value = "シングルトンもどき"
print(myStruct.value)  // シングルトンもどき
print(MyStruct.value)  // シングルトンもどき

確かに、、シングルトンと同じだ、、

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4