簡體   English   中英

可選值上的 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或以某種方式解開它?

您還可以在關鍵路徑上使用可選鏈接。 創建兩個鍵路徑,一個用於用戶,另一個用於信息中的名稱。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM