как написать ключевой путь для ссылки на значение словаря

#swift #swift-keypath

#swift #swift-ключевой путь

Вопрос:

Скажем, у меня есть такая структура:

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

Возможно ли создать ключевой путь для ссылки на значение чего-либо в User.kids свойстве? Что-то вроде User.kids[KidId] ?

В частности, я хотел бы создать WritableKeyPath<User,KidName> . Я думал, что вы могли бы вводить ключевые пути как в словари, так и в массивы, но я не могу найти синтаксис нигде в Интернете. Может быть, это невозможно?

Комментарии:

1. То, что вы написали здесь, работает точно так, как вы описали. Какие у вас проблемы? let kp = Person.kids[kidId]; user[keyPath: kp] . Может быть, путаница в том, что это будет WritableKeyPath<Person,KidName?> (т. Е. Необязательно)?

Ответ №1:

Ваш вопрос неясен, потому что вы ссылаетесь на User него в своем тексте, но имеете Person в своем коде. Это говорит о том, что у вас может быть правильный синтаксис, но неправильная иерархия.

Вы также можете просто забыть вопросительный знак.

Чтобы получить тип, о котором вы спрашиваете, вам также нужно значение a KidID (D пишется с большой буквы в 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