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

时间:2016-04-22 07:59:49

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

2 个答案:

答案 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,因为ssisharedInstance的副本,这当然表明我们的单身实际上并不是单身人士。

答案 1 :(得分:5)

这取决于您希望实现的目标以及您希望如何根据classstruct之间的差异使用您的结构。您将看到的最常见的事情是使用带有单例对象的类。

单身人士几乎相同,他们只创建一次,但你会从classstruct获得不同的行为,因为:

  • 类是引用类型,而结构是值类型
  • 结构用于定义简单结构
  • 结构不能被继承

还有一些差异,但你可以从中得到这个想法。