Правильно, поэтому Decodable на самом деле довольно умен, так как вам не нужно писать код для самостоятельного декодирования. Вам просто нужно убедиться, что вы соответствуете структуре JSON (и создаете структуры, которые также соответствуют Decodable для любых вложенных объектов). Другими словами, вместо использования переменных в качестве словарей сделайте их собственной декодируемой структурой.
Так, например:
struct EventBrite: Decodable {
let pagination: Pagination
let events: [Event]
}
struct Pagination: Decodable {
let page_number: Int
let page_size: Int
let continuation: String
let has_more_items: Bool
}
struct Event: Decodable {
let name: EventName
let description: EventDescription
}
struct EventName: Decodable {
let name: String
let html: String
}
и т.д ...
Здесь важно еще кое-что, если не гарантируется, что ключ или свойство будет возвращено (например, скажем, что EventName
не всегда имеет HTML-значение, возвращаемое с сервера, вы можете легко пометить это значение). как необязательный. Так что-то вроде:
struct EventName: Decodable {
let name: String
let html: String?
}
Еще одно замечание: вы действительно испортили объявления типа словаря. Вы заметите, что event
на самом деле имеет тип [String: [String: String]]
, поскольку ключ является строкой, а значения, кажется, всегда словаря. И зовут [String: String]
. Это не то, что вы записали, как в первоначальном вопросе.
Когда значения могут отличаться, как при разбивке на страницы, вам нужно сделать что-то вроде [String: Any]
, так что будьте осторожны с этим.
ОДНАКО Подход, который я предложил, я думаю, лучше, чем иметь свойства как словари. Во-первых, вам не нужно беспокоиться об объявлении типа словаря (в котором вы допустили несколько небольших ошибок). Но что более важно, когда каждый словарь становится своей собственной четко определенной структурой, и вам не нужно беспокоиться о запоминании или поиске ключей. Синтаксис точки / автозаполнение автоматически подскажет вам, что может быть! (И не приведение, когда ваше значение имеет тип Any
или AnyObject
!)
Также определенно используйте структуры для всего этого, поскольку я однажды оценил производительность и измерил эффективность структур на порядок в миллионы раз эффективнее, чем классы. Просто к вашему сведению.