Есть несколько вопросов:
Прежде всего вы совершаете распространенную ошибку: вы игнорируете корневой объект JSON, представляющий собой словарь с одним ключом humans
. Это ошибка, которая пытается вам сказать.
struct Root : Codable {
let humans : [Human]
}
let human = try FirebaseDecoder().decode(Root.self, from: value)
Но даже добавление корневой структуры не работает, поскольку значение для ключа humans
является словарем, обратите внимание на {}
struct Root : Codable {
let humans : [String:Human]
}
Наконец, никогда, никогда, никогда объявляйте декодируемые элементы структуры как неявные развернутые необязательные опции, либо они не являются необязательными (да, код компилируется без восклицательных знаков), либо обычными необязательными (?
)
struct Human: Codable {
var name: String
var pets: [Pet]?
}
struct Pet: Codable {
var name: String
var animal: Animal
}
enum Animal: String, Codable {
case cat, dog, fish
}
Если вам нужен массив Human
в структуре Root
, а не словарь, вы должны написать собственный инициализатор
struct Root : Codable{
let humans : [Human]
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let humanData = try container.decode([String:Human].self, forKey: .humans)
humans = Array(humanData.values)
}
}