为什么不在Swift中使用基于结构的单例呢?



为什么不使用基于结构的单例呢?

创建可解码的基于结构的单例。

struct Person: Decodable {
static var shared = Person()
private(set) var name: String?
var age: Int?

private init() {

}
mutating func initData(from data: Data) {
if let person = try? JSONDecoder().decode(Person.self, from: data) {
self = person
}
}
}

从其他类初始化:

Person.shared.initData(from: data)

和使用参数:

let name = Person.shared.name 
Person.shared.name = "MyName" //error

Person.shared.age  = 20

走错了吗?

你不能使用一个单例结构,因为struct是一个值类型,所以当你把它分配给一个变量时,你得到一个副本。这可以很容易地显示

struct Singleton {
static var shared = Singleton()
var value: Int
private init() {
value = 0
}
}
Singleton.shared.value = 1
var otherSingleton = Singleton.shared
otherSingleton.value = 2

现在如果我们输出两个

value
print(Singleton.shared.value, otherSingleton.value)

我们

1 2

所以otherSingleton显然是一个单独的实例,所以现在我们有两个单例:)

但是,如果我们简单地将Singleton的类型更改为引用类型的类,然后运行相同的代码,则打印的结果是

2 2

因为它是同一个实例,所以我们改变了value属性。

相关内容

  • 没有找到相关文章

最新更新