MENU

【Swift文法】shared?? シングルトンをわかりやすく解説

目次

1. シングルトンとは何か?

オブジェクト指向プログラミングをしていると、クラスファイルからインスタンスを生成してメソッドを利用することが基本形です。
ここでご質問です。プロジェクト全体で見た時にクラスAのインスタンスは何個ありますか??
そのインスタンスがシングルトンで設計してあれば、答えはひとつです!
つまり、シングルトンとはインスタンスがひとつしか存在しないことを保証する設計方法のことです。

2. シングルトンの実装手順

以下のクラスをシングルトンに設計しなおします。

public class Members {
    init() {}
    private let members: [String: Int] = ["Suzuki": 21, "Takashima": 30]
    public func showAge(name: String) {
        print(members[name]!)
    }
}

let members = Members()
members.showAge(name: "Suzuki")
21

1. finalを付与する

シングルトンは継承禁止です。継承されてしまっては、1クラス1インスタンスで設計しているのに、親戚ができてしまったら困ります。

final public class Members {

2. initをprivateにする

イニシャライザをprivate化することで、絶対にクラスの外部からアクセスできないようにします。

private init() {}

3. 外部からの唯一の入り口を設置

シングルトンにしたいクラスは継承もできない、イニシャライズもできない、ということで外部からの入り口を作ってあげる必要があります。public staticプロパティを使用します。
その変数名はsharedとするのが一般的です。

補足: staticはスレッドセーフな修飾子です。iOSアプリは基本マルチスレッドプログラミングで実装するので、同時に違う処理が動いていることが多いです。なので、このマルチスレッドで処理が動いた時に複数のスレッドからstatic変数にアクセスされたとしても、ひとつしか変数が存在できません。

public static let shared = Members()

4. まとめ

これまでのコードをまとめると以下のようになります。

public class Members {
    private init() {}
    private let members: [String: Int] = ["Suzuki": 21, "Takashima": 30]

    public static let shared = Members()
    public func showAge(name: String) {
        print(members[name]!)
    }
}

Members.shared.showAge(name: "Suzuki")

sharedを介してしか、アクセスできなくなりました!
そしてインスタンスはただひとつpublic static let shared = Members()のみです!

さいごに

シングルトンとは名前の通りで、クラスのインスタンスがひとつ(シングル)しか存在しないことを保証する設計方法でした。名前の割に単純です!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Rio@iOSエンジニアのアバター Rio@iOSエンジニア 経営者兼モバイルアプリエンジニア

都内のモバイルアプリ開発会社経営者。
モバイルアプリの新規の請負開発及び保守運用を引き受ける。
Denso→Honda→現在
#RxSwift #MVVM #Firebase #Python3

コメント

コメントする

目次