如果我有
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();)
或以某种方式解开它?
答案 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"
}