Можете ли вы передать дополнительные данные о состоянии (возможно, в пользовательский) JSONDecoder как часть операции декодирования? - PullRequest
0 голосов
/ 18 сентября 2018

У нас есть древовидная модель данных, основанная на протоколе 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)?

1 Ответ

0 голосов
/ 18 сентября 2018

Вы можете назначить произвольный набор пар ключ / значение для userInfo декодера и прочитать их в методах init.

Обратите внимание, что ключи для userInfo являются CodingUserInfoKey, новы можете создать их из строк, используя CodingUserInfoKey(rawValue: "key")!.

...