这两种方法是否相同,或者是否存在需要注意的主要差异/陷阱:
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
,如下所示:
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
,但我可以将其作为只读属性和变异方法公开;重要的是这两种类型现在都是可变的。如果我这样做
let csi = MyClassSingleton.sharedInstance
csi.state = 42
MyClassSingleton.sharedInstance.helloClass()
42 被打印出来,因为
csi
正在引用共享实例。但是,当我对基于结构的单例做同样的事情时
var ssi = MyStructSingleton.sharedInstance
ssi.state = 42
MyStructSingleton.sharedInstance.helloStruct()
5 被打印出来,因为
ssi
是 sharedInstance
的副本,当然,这表明我们的单例实际上不是单例。关于swift - 基于结构和基于类的单例有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36788169/