Appleの CocoaとObjective-CのドキュメントでSwiftを使う (Swift 3用に更新)では、以下のSingletonパターンの例を示しています。
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
このシングルトンが文字列の可変配列を管理する必要があると想像しましょう。どのように、どこでそのプロパティを宣言し、それが空の[String]
配列に正しく初期化されるようにするのでしょうか。
私にとってはこれが最良の方法です、initを非公開にします。 Swift 3\4\5の構文
// MARK: - Singleton
final class Singleton {
// Can't init is singleton
private init() { }
// MARK: Shared Instance
static let shared = Singleton()
// MARK: Local Variable
var emptyStringArray = [String]()
}
このように空の配列を初期化することができます。
class Singleton {
//MARK: Shared Instance
static let sharedInstance : Singleton = {
let instance = Singleton(array: [])
return instance
}()
//MARK: Local Variable
var emptyStringArray : [String]
//MARK: Init
init( array : [String]) {
emptyStringArray = array
}
}
あるいは、別のアプローチを好む場合は、これでうまくいきます。
class Singleton {
//MARK: Shared Instance
static let sharedInstance : Singleton = {
let instance = Singleton()
return instance
}()
//MARK: Local Variable
var emptyStringArray : [String]? = nil
//MARK: Init
convenience init() {
self.init(array : [])
}
//MARK: Init Array
init( array : [String]) {
emptyStringArray = array
}
}
Appleのドキュメントによると、 Swiftでは、単純に静的なtypeプロパティを使用することができます。これは、複数のスレッドに同時にアクセスした場合でも、1回だけ遅延初期化されることが保証されています 。
class Singleton {
// MARK: - Shared
static let shared = Singleton()
}
初期化メソッドを使って:
class Singleton {
// MARK: - Shared
static let shared = Singleton()
// MARK: - Initializer
private init() {
}
}
初期化はinitメソッドで行われます。ここではシングルトンと非シングルトンの間に違いはありません。