Синглтон со свойствами в Swift 3
в Apple использование Swift с Cocoa и Objective-C document (обновлено для Swift 3) они дают следующий пример Одноэлементного шаблона:
class Singleton {
static let sharedInstance: Singleton = {
let instance = Singleton()
// setup code
return instance
}()
}
давайте представим, что этот синглтон должен управлять переменным массивом строк. Как / где я могу объявить это свойство и убедиться, что оно правильно инициализируется пустым [String]
массив?
4 ответа:
для меня это лучший способ, сделать init частным. Swift 3 / 4 синтаксис
// 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 вы можете просто использовать свойство статического типа, которое гарантированно будет лениво инициализировано только один раз, даже при одновременном доступе к нескольким потокам.
class Singleton { // MARK: - Shared Instance static let sharedInstance = Singleton() }
или, с методом инициализации:
class Singleton: NSObject { // MARK: - Shared Instance static let sharedInstance: Singleton = { let instance = Singleton() // setup code return instance }() // MARK: - Initialization Method override init() { super.init() } }