swift - 基于结构和基于类的单例有什么区别?

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

最佳答案

主要区别在于基于类的可变单例有效,而基于结构的可变“单例”则无效。除非你想让你的单例不可变(这种情况很少见),否则你应该坚持使用基于类的单例。

这是一个说明可变的基于结构的“单例”如何不起作用的例子。考虑向两个单例添加一个可变成员 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/

相关文章:

swift - 如何连接 JSON 对象 Swift?

ios - Firebase:按 child 数量排序的查询

ios - RxSwift 观察数组中struct类型的变量字段

swift - PerformSegueWithIdentifier 不适用于以编程方式生成的 UIButtons (iOS/Swift)

swift - 发现不支持的类型 - 使用 -availableMetadataObjectTypes 的问题

ios - 如何一次将更改应用于多个 View Controller ?

swift - 如何在 SpriteKit (Swift) 中获取施加在对象上的力

SwiftUI 教程PresentationButton 错误

ios - 如何在 swift 中引用 subview 层次结构

ios - UILongPressGestureRecognizer 在状态改变时继续动画