问题描述
我想要一个简单的序列化实现来存储类的各种 KeyPath 的值并应用它们。我知道这可以通过手动存储变量来实现,但我更喜欢使用 keypaths,因为添加其他路径会更容易。请参见下面的示例:
class Model {
var intValue: Int
var boolValue: Bool
}
class ModelState {
static let keypaths = [ \Model.intValue,\Model.boolValue ]
let values: [PartialKeyPath<Model>,Any]
init(model: Model) {
var values = [PartialKeyPath<Model>,Any]()
Self.keypaths.forEach { values[$0] = model[keyPath: $0 }
self.values = values
}
}
extension Model {
var state: ModelState {
get { return ModelState(model: self }
set { newValue.values.forEach { (keyPath,value) in applyValue(keyPath,value) } }
}
private func applyValue<T>(_ keyPath: PartialKeyPath<Model>,value: T) {
if let writeable = keyPath as? ReferenceWriteableKeyPath<Model,T> {
self[keyPath: writeable] = value
}
}
}
如果我在 applyValue() 中添加断点,keyPath 将显示为预期的 ReferenceWriteableKeyPath。同样,如果我尝试通过明确说明预期值类型(例如 ReferenceWriteableKeyPath<Model,Int>
或 ReferenceWriteableKeyPath<Model,Bool>
)来对 KeyPath 进行类型转换,则类型转换工作正常。然而,所写的代码永远不会进入条件。有没有人看到代码的问题或知道如何使这种通用的向下转换工作?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)