はじめに
今回は、シングルトンについて書いていこうと思います!
シングルトンとはなんぞやと言うところから、シングルトンを使う場面やメリットについて公式ドキュメントを元に書いていきます!
公式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) // シングルトンもどき
確かに、、シングルトンと同じだ、、