你如何编写一个 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
假设我有这样的结构:
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