Help us understand the problem. What is going on with this article?

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

はじめに

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

公式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)  // シングルトンもどき

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

Julio_Vantage
新卒1年目の新米エンジニアです。 (営業職の企業に入社して4日で転職してエンジニアになりました!) 主にiOS開発に従事してます。
vantageit
システム開発を行っているヴァンテージITです! 自己成長を促すチームをテーマに受託開発・自社開発を行っています
https://vantageit.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした