概要

こんにちは、Webエンジニアの石山です!
今回はiOS開発で、アプリ内でデータを保持するための1つの方法である、シングルトン(Singleton)について解説と、Swiftでの実装方法を解説します。

iOSアプリ開発でのデータ保持方法には、さまざまな方法があります。

  • 「初回ログインか否かの判定データ(初回の場合、チュートリアル画面を表示)」
  • 「前回見ていた画面情報(アプリの再度起動時に「続きから」を実現)」
  • 「入力データを保持したい(外部DBを使用しない)」
  • 「ログイン情報を保持したい」

上記のように、データを保持したいシチュエーションはさまざまあり、半永久的に保持したい場合は、用途・要件によってUserDefaultsKeyChainDatabaseなどを使用して、実装したりすることが多いですが、アプリが終了すると特に必要ないが、起動時はずっと保持したいデータなどがある場合は、今回のシングルトン(Singleton)がマッチするかと思います。

シングルトン(Singleton)とは

シングルトンとは、デザインパターンの1つで、「実行時にそのクラスのインスタンスが必ず単一になるよう設計すること」です。

シングルトンで実装されたクラスのインスタンスは、アプリ内に1つしか存在せず、どこから参照されても常に同一のインスタンスを参照するよう強制できます。
つまり、アプリ内のデータとして保持し、どのViewControllerからでも参照できるような、アプリ内データとして使用できるようになります。

どんな場面で使用するの?

ログイン後のユーザ情報
iOSアプリだけでなく、Web版もあるようなアプリでは、Webでユーザ名やユーザIDなどを変更することが可能なので、ログインAPIやユーザ情報取得APIをアプリ起動時に必ず実行することもあるかと思います。
その際に、半永続的なUserDefaultsなどに保持してしまうと、Web側で変更された情報が反映ず、古い情報がアプリに表示されてしまうことがあるため、半永久的よりかは、アプリ起動中に保持するシングルトンなクラスを使用することがあります。

実装方法

それでは、ユーザ情報を保持するクラスをシングルトン(Singleton)で実装してみましょう。

// ユーザ情報保持するクラス
final class UserInfo {
  // インスタンスを参照するためのプロパティ
  static let shared = UserInfo()
  // ユーザID
  var id: String = ""
  // ユーザ名
  var name: String = ""

  // イニシャライズ
  private init() {}

  // ユーザ情報セットメソッド
  public static func setUserInfo(id: String, name: String) {
    self.id = id
    self.name = name
  }
}

// =============================================================

// 何かしらのログインAPIやユーザ情報取得APIの実行完了時
userInfoStream.listen { response in
  // UserInfoにセット
  UserInfo.setUserInfo(id: response.id, name: response.name)
}

// 別のViewControllerなどで
let id = UserInfo.shared.id
let name = UserInfo.shared.name

print("[ID: \(id)]のユーザ名は「\(name)」です。")
ポイント1: classはfinalに
final class UserInfo {
シングルトン(Singleton)は、継承を防ぐため、finalを付けるようにします。
ポイント2: privateでinit
private init() {}
シングルトン(Singleton)のクラスは、アプリ内で1つでなければならないので、他からインスタンス化できないようにprivateにします。
ポイント3: public staticなsharedプロパティを作成
static let shared = UserInfo()
publicでstaticなsharedプロパティを作成し、自身(シングルトンのクラス)のインスタンスを保持します。
このsharedプロパティ経由で、シングルトンなクラス内のプロパティ(ユーザIDやユーザ名)を参照します。

まとめ

今回は、iOSアプリ内のデータ保持方法の1つであるシングルトン(Singleton)なクラスの説明と実装方法について解説しました。
他にも、UserDefaultsやKeyChain、DBなどもまた記事にしていきたいと思ってますので、よろしくお願いします。