Swift 4 KeyPath可选值

时间:2018-02-09 12:15:19

标签: swift swift4

如果我有

nameKeyPath

KeyPath给我一个ReferenceWritableKeyPath我以后无法使用它来修改名称值,但如果我强制打开它,我会得到一个referencedNameKeyPath这就是我和我#39;之后。

不幸的是,由于意外地发现nil,使用KeyPath沿着该行的零值会发生崩溃。

我的问题是有没有办法将ReferenceWritableKeyPath转换为var var1 = (from a in db.table_1 join b in db.table_2 on a.Id equals b.Id where db.State.Any(c=> c.RegionId == 1 && c.StateId == b.StateId) select new { a.Id }).ToList();) 或以某种方式解开它?

2 个答案:

答案 0 :(得分:3)

您还可以在键路径上使用可选链接。为用户创建一个密钥路径,为信息中的名称创建另一个密钥路径。

let infoKeyPath = \WrappedClass.user.info

let nameKeyPath = \Info.name

现在,使用带有keypath的可选链接,结果会产生 String?

let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]

答案 1 :(得分:1)

尝试将密钥路径作为计算的可选变量。像那样:

class WrappedClass {
  var user: User = User()

  var nameKeyPath: ReferenceWritableKeyPath<WrappedClass, String?>? {
    guard let _ = user.info else { return nil }
    return \WrappedClass.user.info!.name
  }
}

你仍然最终使用了力量展开符号,但它不应该引起任何问题,因为你特别保护它。

这样您就可以安全方便地使用计算出的密钥路径:

let instance = WrappedClass()

if let nameKeyPath = instance.nameKeyPath {
  instance[keyPath: nameKeyPath] = "Nikola"
}