LoginSignup
10
12

More than 1 year has passed since last update.

[Swift]シングルトンを実装してみよう

Posted at

シングルトンとは

シングルトンパターンとはインスタンスが1個しか生成されないことを保証するものです。

ではどんな時に使うのか

実際に使う目的としてはインスタンスが1個しか生成されないことを保証したいときに使うのですが、ではどのような時に1個しかインスタンスを生成するべきなのでしょうか?
目的はいくつかあって、、

・情報(値)を共通化したいのに使用するクラスで都度、インスタンスを生成するのが手間
→メモリを節約したい
・たくさんのインスタンスからアクセスされると困る時

などと書きましたが、ざっとまとめると、
インスタンスを一回一回生成する処理を書いていたらコードも冗長だし、値も都度リセットされてしまうから同じ値をいろんなところで使うには適してないよねっていう時に使うという認識で間違いないと思います。

実際に実装してみよう

public class Hoge {
    init() {} 
    private var hoge: [String: Any] = ["name": "Luffy", "age": 19] 
}

こちらのクラスにシングルトンを実装していきましょう。

①継承されないためのfinal

シングルトンは継承されてしまっては効果を発揮しません。
そのため、継承を防ぐためのfinalをクラスにつけてあげる必要があります。
(継承されていないのを明示するためにも)

final public class Hoge {

}

②初期化(init)をprivate化

シングルトンであるためには使用する時に直接インスタンス化をさせないようにするためにinitをprivate化してあげます。

final public class Hoge {
   private init() {}
}

③sharedというプロパティを実装

外部からのアクセスはこのsharedというプロパティを介して行うことにするために
public static let shared = Hoge()
と書きHogeクラスのインスタンスを割り当てます。

final public class Hoge {

      public static let shared = Hoge()

   private init() {}
}

staticはインスタンスを共通化できます。
staticの特徴として、複数のスレッドが一度にstaticプロパティにアクセスした時インスタンスが複数回生成されることを防ぐことができます。
ここまでがシングルトンの真髄になります。

④実際にメソッドを実装する

シングルトンパターンのクラスに実際にメソッドを加えてみましょう。

final public class Hoge {

   public static let shared = Hoge()

   private init() {}

   public func keyString(forkey key: String) -> String? {
    return hoge[key] as? String
   }
}

先程のHogeクラスのhogeに格納されている値にアクセスするメソッドです。

⑤シングルトンを使ってアクセスする

先程定義したsharedを窓口にしてメソッドにアクセスしてみます。

print(Hoge.shared.keyString(forkey: "name"))   // Optional("Luffy")
print(Hoge.shared.keyString(forkey: "age"))   // Optional(19)

参考記事

本記事はこちらの記事を自分なりにまとめたものです。
分かりやすい記事をありがとうございました!
https://ticklecode.com/swiftsingleton/

10
12
1

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
10
12