为什么不使用基于结构的单例呢?
创建可解码的基于结构的单例。
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
属性。