У нас есть древовидная модель данных, основанная на протоколе Codable
.Корень дерева содержит свои непосредственные дочерние элементы, а также ссылку на все дочерние элементы в иерархии, как показано здесь ...
Root
|
|-->Children
| |
| |-->Item 1
| |-->Item 2
| | |
| | \-->Children
| | |
| | \-->Item 3
| |
| \-->Item 4
| |
| \-->Children
| |
| \-->Item 5
| |
| \-->Children
| |
| \-->Item 6
|
\-->AllChildren <<-- Not Serialized!!
|
|-->Item 1
|-->Item 2
|-->Item 3
|-->Item 4
|-->Item 5
\-->Item 6
Теперь часть AllChildren
не сериализована, как онипросто ссылки на фактические экземпляры сверху.
Для того, чтобы вышеуказанное сработало, нам нужно заполнить AllChildren
программно, так как эти потомки декодируются.Однако мы не уверены, как передать объект Root
в детские вызовы init(from:Decoder)
, чтобы справиться с этим, поскольку мы не видим способа передать дополнительные данные состояния в цепочку декодирования.Кажется, единственная доступная вам информация - это Decoder
, которую вы не контролируете.
Наш обходной путь находится внутри init(from:Decoder)
Root
, как только он завершит декодирование / инициализацию всехпотом своих потомков он заново сканирует всю иерархию, отсекая потомков, но я очень не хочу, чтобы мне пришлось заново сканировать иерархию, просто сделав это во время прохода init(from:Decoder)
.
есть способ передать дополнительную информацию о состоянии в процесс Decode
, предпочтительно как что-то на Decoder
, передаваемом вызовам init(from:Decoder)
?