Используйте промежуточные структуры для погружения в мусорный бак и сбора необходимых данных, а затем утилизируйте их.
Итак, начните со структуры Dog, объявленной на верхнем уровне:
struct Dog : Decodable { let name : String }
В вашем реальном коде создайте временные локальные структуры, чтобы обернуть его и декодировать JSON:
struct TheChildren : Decodable { let children : [Dog] }
struct TheData : Decodable { let data : TheChildren }
let arr = try! JSONDecoder().decode([TheData].self, from: yourJSONdata)
Теперь просто вытащите нужные Dogs:
let dogs = arr.map {$0.data.children}
/*
[[Dog(name: "Ralph"), Dog(name: "Woofer")],
[Dog(name: "Spot"), Dog(name: "Trevor")]]
*/
Это массив массивов DogsТаким образом, оба «массива поддерживаются отдельно» в том смысле, что они являются отдельными элементами массива результатов.Это выглядит вполне разумным представлением.
Теперь, если вы хотите добавить эту информацию в новую структуру, хорошо.Она не будет такой же, как ваша положенная структура Result, потому что имена dogs1
и dogs2
нигде не появляются в данных, и вы не можете составить имя свойства во время выполнения (ну, в Swift 4.2 вывроде можно, но это уже другая история).Но дело в том, что у вас есть данные о собаках, легко и без лишних материалов.И нет никакой реальной причины, почему доступ к первому массиву с именем dogs1
лучше, чем получение его по индексу как dogs[0]
;действительно, последнее на самом деле лучше.Окончание имени свойства с индексным номером - всегда Плохой запах, свидетельствующий о том, что вам действительно нужна коллекция какого-то рода.