一尘不染

基于Struct和基于类的单例之间有什么区别?

swift

两种方法是相同的还是要注意的主要差异/陷阱?

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") }
}

阅读 301

收藏
2020-07-07

共1个答案

一尘不染

主要区别是基于类的可变单例有效,而基于结构的可变“单例”无效。除非您想使单身人士不可变(这是很少见的),否则您应该坚持基于类的方式。

这是一个可变的基于结构的“单身”如何工作的例证。考虑将可变成员添加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,这当然表明我们的单例实际上不是单例。

2020-07-07