两种方法是相同的还是要注意的主要差异/陷阱?
class MyClassSingleton { static let sharedInstance = MyClassSingleton() private init(){} func helloClass() { print("hello from class Singleton") } } struct MyStructSingleton { static let sharedInstance = MyStructSingleton() private init() {} func helloStruct() { print("hello from struct Singleton") } }
主要区别是基于类的可变单例有效,而基于结构的可变“单例”无效。除非您想使单身人士不可变(这是很少见的),否则您应该坚持基于类的方式。
这是一个可变的基于结构的“单身”如何工作的例证。考虑将可变成员添加state到两个单例中,如下所示:
state
class MyClassSingleton { static let sharedInstance = MyClassSingleton() private init(){} var state = 5 func helloClass() { print("hello from class Singleton: \(state)") } } struct MyStructSingleton { static let sharedInstance = MyStructSingleton() private init() {} var state = 5 func helloStruct() { print("hello from struct Singleton: \(state)") } }
我做state了一个var,但是我可以将其公开为只读属性和一个变异方法。重要的是这两种类型现在都是可变的。
var
如果我这样做
let csi = MyClassSingleton.sharedInstance csi.state = 42 MyClassSingleton.sharedInstance.helloClass()
打印42,因为csi引用了共享实例。
csi
但是,当我对基于结构的单例执行相同的操作时
var ssi = MyStructSingleton.sharedInstance ssi.state = 42 MyStructSingleton.sharedInstance.helloStruct()
而是打印5,因为ssi是的副本sharedInstance,这当然表明我们的单例实际上不是单例。
ssi
sharedInstance