微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用泛型将 PartialKeyPath 向下转换为 ReferenceWriteableKeyPath?

如何解决使用泛型将 PartialKeyPath 向下转换为 ReferenceWriteableKeyPath?

我想要一个简单的序列化实现来存储类的各种 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 举报,一经查实,本站将立刻删除。