这两种方法是否相同,或者是否存在需要注意的主要差异/陷阱:

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 被打印出来,因为 ssisharedInstance 的副本,当然,这表明我们的单例实际上不是单例。

关于swift - 基于结构和基于类的单例有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36788169/

10-14 23:04