你如何编写一个 KeyPath 来引用字典的值

how do you write a KeyPath to reference the value of a dictionary

假设我有这样的结构:

struct Person {
  var kids: [KidId: KidName] = [:]
}

是否可以构造一个键路径来引用 User.kids 属性 中某些内容的 ?类似于 \User.kids[KidId]?

具体来说,我想构建一个 WritableKeyPath<User,KidName>。我以为您可以通过 keypath 进入字典和数组,但我终究无法在 Internet 上的任何地方找到语法。也许这是不可能的?

您的问题不清楚,因为您在文本中提到了 User,但在您的代码中有 Person。这表明您可能语法正确但层次结构错误。

您也可能只是忘记了问号。

要获得您询问的类型,您还需要一个 KidID (the D is capitalized in Swift) 值,而不是 KidID 类型。

typealias KidID = String
enum KidName { case goatBoy }
\Person.kids[""] as WritableKeyPath<Person, KidName?>
Person(kids: ["": .goatBoy])[keyPath: \.kids[""]] // .goatBoy

您不必在键路径中提供值,但这是不同的类型。

\Person.kids as WritableKeyPath<Person, [KidID: KidName]>
Person(kids: ["": .goatBoy])[keyPath: \.kids][""] // .goatBoy