拍摄对象的快照并从快照恢复。


Build Code Coverage Release Swift Version License

安装

将以下依赖项添加到你的 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"