Swift 可选值上的 KeyPath
Swift KeyPath on optional value
如果我有
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 ReferenceWritableKeyPath
nameKeyPath
给我一个 KeyPath
,我以后不能用它来修改名称值,但是如果我强行打开它,我会得到一个 ReferenceWritableKeyPath
这就是我之后。
不幸的是,由于意外发现 nil,沿线使用带有 nil 值的 referencedNameKeyPath
预计会崩溃。
我的问题是有没有一种方法可以将 KeyPath
转换为 ReferenceWritableKeyPath
或者以某种方式将其展开?
尝试将键路径作为计算的可选变量。像这样:
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"
}
您还可以在键路径上使用可选链接。创建两个键路径,一个用于用户,另一个用于信息中的名称。
let infoKeyPath = \WrappedClass.user.info
let nameKeyPath = \Info.name
现在,将可选链接与键路径一起使用,结果将产生 String?。
let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]
如果我有
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 ReferenceWritableKeyPath
nameKeyPath
给我一个 KeyPath
,我以后不能用它来修改名称值,但是如果我强行打开它,我会得到一个 ReferenceWritableKeyPath
这就是我之后。
不幸的是,由于意外发现 nil,沿线使用带有 nil 值的 referencedNameKeyPath
预计会崩溃。
我的问题是有没有一种方法可以将 KeyPath
转换为 ReferenceWritableKeyPath
或者以某种方式将其展开?
尝试将键路径作为计算的可选变量。像这样:
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"
}
您还可以在键路径上使用可选链接。创建两个键路径,一个用于用户,另一个用于信息中的名称。
let infoKeyPath = \WrappedClass.user.info
let nameKeyPath = \Info.name
现在,将可选链接与键路径一起使用,结果将产生 String?。
let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]