🫥

swift シングルトンなクラスと静的なメソッドについて

に公開

シングルトンについて、

シングルトンを使用する際は、ルーティング用のクラスや、ユーザー情報を保持するクラスで使用します。シングルトンを使用することで、アプリケーション内で一貫した状態や機能を簡単に管理することができますとのことです。

一般的な例として、クラス内にprivateなstaticなインスタンス変数を持ち、そのクラスの唯一のインスタンスを返すstaticなメソッドを提供することです。
以下例のソースです↓

class MySingleton {
   //シングルトンのインスタンスを格納するプライベート変数
   private static let sharedInstance = MySingleton()
  //プライベートなイニシャライザを使って外部からインスタンス化を防ぐ
  private init() {}
   //シングルトンのインスタンスを取得するための静的メソッド
   static func shared() -> MySingleton {
     return sharedInstance
   }
   //その他のメソッドやプロパティを定義する
   func doSomething() {
     print("Singleron is doing something")
   }
}

//シングルトンを使用する
let singleton = MySingleton.shared()
singleton.doSomething()

上記を解説していきます。

MySingletonクラスを定義、
↓
private static let sharedInstance = MySingleton()
でMySingletonのインスタンスを格納する、privateでstaticなsharedInstance変数を定義しています。

※private →定義したクラス(MySingleton)のみでアクセス可能になる
※static →そのクラスのインスタンスとは独立して存在する変数で、クラスのインスタンスを作成せずに直接アクセスできるもの
※※例えば、MyClassにstatic var countと定義したとするそして出力したい⇨print(MyClass.count) クラス名とstatic変数をしてするだけで使用できる
↓
private init() {}
で、クラスのイニシャライザをプライベートに設定している
※このクラスのインスタンスはクラス内でしか作成できなくなる
↓
static func shared() -> MySingleton {
     return sharedInstance
   }
で、MySingletonのshared()という静的なメソッドとして定義している
※staticをつけることで、このメソッドが、インスタンスに関連つけられず、クラス自体に関連づけられていることを示している。
※MySingletonを戻り値とすることでそのクラスのインスタンスを取得できるようにしている
※sharedInstanceのみがクラスのインスタンスにアクセスできる唯一の変数になる
↓
  func doSomething() {
     print("Singleron is doing something")
   }
※とりあえず定義

↓
let singleton = MySingleton.shared()
こちらで、MySingletonで定義したshared()メソッドを使用し、その戻り値として返される唯一のインスタンスをsingleton変数に代入している
↓
singleton.doSomething()
で、singletonに代入されたインスタンスに、doSomethingを代入している

僕的に覚えておきたいこと↓

前提、シングルトンの場合、通常は静的なメソッドを介して唯一のインスタンスにアクセスする。静的メソッドがそのシングルトンのインスタンを持つ変数を戻り値として返すことで、その唯一のインスタンスを取得し、そのインスタンスのメソッドやプロパティを利用できる。

private static let 変数名(hoge) = クラス名()

private static let 変数名 = クラス名() でシングルトンなクラス※(クラスで唯一のインスタンスhoge)を定義することができます。

private⇨swiftの制御装飾子の一つで、その要素が定義されたスコープないでのみアクセス可能になる。
static→そのメンバーが特定のインスタンスに紐づかず、クラスや列挙体自体に属することを意味する。そのクラスのインスタンスを介さずに共通の機能やデータにアクセスできるということ。

private init() {}

クラスのイニシャライザ(初期化メソッド)をprivateにするための構文。

静的なメソッドを作成する方法

静的なメソッドを実装するメリットとしては、
クラスのインスタンスを作成せずに、クラス名を使用して直接呼び出すことができる点。

static func メソッド名() -> クラス名 {
     return 戻り値の文
   }

シングルトンのインスタンスを持つ変数を静的メソッドの戻り値に設定することで、シングルトン唯一のインスタンスにアクセスしてメソッドを実行することができる。

let 変数名 = シングルトンなクラス.静的メソッド()

シングルトンなクラスの中の静的なメソッドを変数に代入して使用することで、インスタンスを作成することなく直接メソッドを利用することができる。

Discussion