В документе Apple « Использование Swift с Cocoa и Objective-C» (обновленном для Swift 3) они приводят следующий пример шаблона Singleton:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
Представим, что этот синглтон должен управлять переменным массивом строк. Как / где мне объявить это свойство и убедиться, что оно правильно инициализируется пустым [String]
массивом?
static let shared = Singleton()
static let shared: Singleton = Singleton()
ты можешь просто написатьstatic let shared = Singleton()
final class Singleton: NSObject { private override init() { } }
Вы можете инициализировать пустой массив следующим образом.
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 } }
источник
extension Cache { static let sharedInstance: Cache = { let instance = Cache() return instance }() }
class var
в iOS 10 для синглтонов (например, UIApplication). Будет ли их реализация такой же?private
методы не дажеinternal
. Это не позволяет другим использовать инициализатор по умолчанию '()' для этого класса.private
вinit
.Согласно документации Apple: в Swift вы можете просто использовать свойство статического типа, которое гарантированно будет лениво инициализировано только один раз, даже при одновременном доступе через несколько потоков .
class Singleton { // MARK: - Shared static let shared = Singleton() }
С методом инициализации:
class Singleton { // MARK: - Shared static let shared = Singleton() // MARK: - Initializer private init() { } }
источник
Любая инициализация будет выполняться в методе инициализации. Здесь нет разницы между синглтоном и не-синглом.
источник