这两种方法是否相同,或者是否存在重大差异/陷阱:
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") }
}
答案 0 :(得分:62)
主要的区别在于基于类的可变单例工作,而基于结构的可变单元和#34;没有按'吨。除非你想让你的单身人士不可变(这是罕见的),你应该坚持使用基于班级的单身人士。
这里是一个可变的基于结构的"单身"不起作用。考虑向两个单身人士添加一个可变成员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
的副本,这当然表明我们的单身实际上并不是单身人士。
答案 1 :(得分:5)
这取决于您希望实现的目标以及您希望如何根据class
和struct
之间的差异使用您的结构。您将看到的最常见的事情是使用带有单例对象的类。
单身人士几乎相同,他们只创建一次,但你会从class
和struct
获得不同的行为,因为:
还有一些差异,但你可以从中得到这个想法。