如果我有
class Info {
var name: String?
}
class User {
var info: Info?
}
class WrappedClass {
var user: User = User()
}
let nameKeyPath = \WrappedClass.user.info?.name //Gets me KeyPath
let referencedNameKeyPath = \WrappedClass.user.info!.name //Gets me ReferenceWritableKeyPathnameKeyPath为我提供了一个KeyPath,我以后不能用它来修改名称值,但是如果我强制拆开它,我就会得到一个ReferenceWritableKeyPath,这就是我想要的。
不幸的是,由于意外地找到了nil,所以在行中使用带有nil值的referencedNameKeyPath会导致崩溃。
我的问题是,是否有一种方法可以将KeyPath转换为ReferenceWritableKeyPath,或者在此过程中以某种方式展开它?
发布于 2018-02-09 16:15:50
您还可以在键盘上使用可选链接。创建两个键盘,一个用于用户,另一个用于信息中的名称。
let infoKeyPath = \WrappedClass.user.info
let nameKeyPath = \Info.name现在,使用带有键盘的可选链接,它将生成字符串?作为结果。
let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]发布于 2018-02-09 15:04:19
尝试将键路径作为计算的可选变量。就像这样:
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"
}https://stackoverflow.com/questions/48705622
复制相似问题