Swift で マネージャー系のコードを書く時にはシングルトンの実装を迫られる場合があります。インスタンスとしていくつも存在されても困る場合があるからです。そんな時に便利な二つのイディオムを紹介します。
通常のシングルトン
.swift
class Manager {
static let sharedManager = Manager()
private init() {
}
}
-
static let
の構文 -
init
をprivate
にする - 初期化がインスタンスの生成がシンプルな場合に便利
クロージャーを使ったシングルトン
.swift
class Manager {
static var sharedManager: Manager = {
return Manager()
}()
private init() {
}
}
-
static var
の構文 -
init
をprivate
にする - インスタンスはクーロージャ内
{
}
で生成して、return
文で戻す - クロージャーの最後の
()
を忘れないで - インスタンスの生成の為に、ファイルやリソースを用意したりなど、いくつかステップを踏む必要がある場合に便利
(EDIT: 表現を変更しました)
どちらでも、シングルトンのオブジェクトを生成します
.swift
var manager1 = Manager.sharedManager
var manager2 = Manager.sharedManager
manager1 === manager2 // true
init
に private
が付いているので、基本的には直接生成はできません。ただし、同じソースファイルから呼び出す場合はその限りではありません。Playground で試す場合は要注意ですね。
【参考情報】
Swiftでシングルトンパターンを実装する3つの方法
http://qiita.com/susieyy/items/acb3bc80a1dafe64cffd