#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