[英]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
或以某種方式解開它?
您還可以在關鍵路徑上使用可選鏈接。 創建兩個鍵路徑,一個用於用戶,另一個用於信息中的名稱。
let infoKeyPath = \WrappedClass.user.info
let nameKeyPath = \Info.name
現在,使用帶有鍵路徑的可選鏈接,它會產生字符串嗎? 結果。
let name = wrappedInstance[keyPath: infoKeyPath]?[keyPath: nameKeyPath]
嘗試將關鍵路徑作為計算的可選變量。 像這樣:
class WrappedClass {
var user: User = User()
var nameKeyPath: ReferenceWritableKeyPath<WrappedClass, String?>? {
guard let _ = user.info else { return nil }
return \WrappedClass.user.info!.name
}
}
您仍然會得到 force unwrap 符號,但它不會引起任何問題,因為您專門保護它。
這樣您就可以安全方便地使用計算出的密鑰路徑:
let instance = WrappedClass()
if let nameKeyPath = instance.nameKeyPath {
instance[keyPath: nameKeyPath] = "Nikola"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.