在Swift 3中有属性的单身人士
在Apple的Cocoa和Objective-C文档中使用Swift (Swift 3进行了更新),他们给出了以下Singleton模式的例子:
class Singleton { static let sharedInstance: Singleton = { let instance = Singleton() // setup code return instance }() }
假设这个单例需要pipe理一个可变的string数组。 我将如何/在哪里声明该属性,并确保它正确初始化为一个空的[String]
数组?
对我来说,这是最好的方法,使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 } }
根据苹果的文档: 在Swift中,你可以简单地使用一个静态types属性,即使在同时在多个线程中访问时,也只能保证只进行一次延迟初始化 。
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() } }
任何初始化都将在init方法中完成。 单身人士和非单身人士没有区别。