У меня есть следующие классы:
class AlgoliaLocation: Codable {
var id: String
var address: String?
var otherInfo: String?
}
struct AlgoliaHit<T: AlgoliaLocation>: Codable {
var highlightResult: [T.CodingKeys : [AlgoliaHighlightResult]]
var coordintates: [AlgoliaCoordinate]
enum CodingKeys: String, CodingKey {
case highlightResult = "_highlightResult"
case coordinates = "_geoloc"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if let temp = try? container.decode([T.CodingKeys : AlgoliaHighlightResult].self,
forKey: .highlightResult) {
var highlightResult = [T.CodingKeys : [AlgoliaHighlightResult]]()
for (key, value) in temp {
highlightResult[key] = [value]
}
self.highlightResult = highlightResult
} else {
highlightResult = try container.decode([ T.CodingKeys : [AlgoliaHighlightResult]].self,
forKey: .highlightResult)
}
}
Я застрял в декодировании значения highlightResult
, потому что значение ключа кодирования может быть либо массивом, как определено в модели класса AlgoliaHit
, либо непосредственно объектом типа AlgoliaHighlightResult
. Таким образом, каждый ключ из AlgoliaLocation.CodingKeys
может иметь тип [AlgoliaHighlightResult]
или AlgoliaHighlightResult
, и мне нужен способ перебора каждого динамического ключа при декодировании и сопоставлении значения с массивом, когда он не является массивом. Я пытался декодировать все как значения массива и все как значения объекта, но они чередуются, и ключ может быть одним из них (массивом или объектом). Благодарю вас! Если что-то неясно, это то, что я пытаюсь сопоставить: Алголия JSON.