LoginSignup
0
4

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

Posted at

# 目次

  1. シングルトンとは何か?
  2. モーダルのカスタム
  3. さいごに

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

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

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

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

Members.swift
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. まとめ

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

Members.swift
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()のみです!

さいごに

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

0
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
0
4