将以下依赖项添加到你的 Package.swift
文件中
.package(url: "https://github.com/jordanbaird/Restore", from: "0.0.1")
Restore
是一个方便易用的软件包,允许你拍摄对象的快照,并将对象恢复到拍摄快照时的状态。
首先,创建一个符合 RestorableObject
协议的类型,并使用 Restorable
属性修饰你希望包含在快照中的属性。
class FavoriteFruits: RestorableObject {
@Restorable var rank1 = "Apple"
@Restorable var rank2 = "Banana"
@Restorable var rank3 = "Watermelon"
}
let favorites = FavoriteFruits()
假设稍后,“香蕉”超越了“苹果”,进入了 rank1
。为了以防万一,评委们想保存当前的结果,以防出错。他们使用 takeSnapshot(withKey:)
方法来保存。现在他们可以自由地更新结果了。
favorites.takeSnapshot(withKey: "BackupResults")
favorites.rank1 = "Banana"
favorites.rank2 = "Apple"
后来,他们发现确实犯了一个错误。选票被错误地计算了,结果现在无效。幸运的是,他们有备份。他们不必遍历每个单独的属性并将它们的值设置回原始状态,只需调用 restore(withKey:)
方法即可。每个属性都设置回出错之前的状态。危机解除。
favorites.restore(withKey: "BackupResults")
print(favorites.rank1) // Prints "Apple"
print(favorites.rank2) // Prints "Banana"
现在,假设评委们获得了一个新的 Counter
对象。它可以自动统计结果并将结果存储在自身中。但是他们仍然希望查看结果的人能够访问来自计数器的结果。为此,他们必须使用计算属性。
class FavoriteFruits: RestorableObject {
let counter = Counter()
var rank1: String {
counter.rank1
}
var rank2: String {
counter.rank2
}
var rank3: String {
counter.rank3
}
}
然而,这带来了一个问题,因为计算属性不支持属性包装器。现在他们无法将他们的排名标记为 Restorable
。然后,一位阅读过文档的评委记得,他们可以将计算属性添加到 references
数组中,并且它们仍然会包含在快照和恢复中。再次,危机解除。
class FavoriteFruits: RestorableObject {
let counter = Counter()
var rank1: String {
counter.rank1
}
var rank2: String {
counter.rank2
}
var rank3: String {
counter.rank3
}
var references: [Reference<FavoriteFruits>] {
Reference(owner: self, name: "rank1", keyPath: \.rank1)
Reference(owner: self, name: "rank2", keyPath: \.rank2)
Reference(owner: self, name: "rank3", keyPath: \.rank3)
}
}
Reference
类型初始化器中的name
参数必须与属性的名称相同,否则该属性将不会被保存。
你还可以从快照中访问单个属性。
let properties = try favorites.properties(withKey: "BackupResults")
print(properties.rank1)
// Prints: "Apple"