Я пытаюсь проанализировать следующий пример значений DateInterval, которые Api поддерживает в следующем формате ISO 8601:
[
{"ISO8601":"PT10M","text":"time: 00:10"},
{"ISO8601":"PT1H10M","text":"time: 01:10"},
{"ISO8601":"PT3H20M","text":"time: 03:20"}
]
для следующей модели:
struct DTOTest:Codable {
var ISO8601:DateInterval
var text:String
}
Но я получаю следующее исключение несоответствия:
Несоответствие типа 'Dictionary' Контекст: ожидается декодирование словаря, но вместо него найдена строка / данные. CodingPath: [_JSONKey (stringValue: «Index 0», intValue: 0), CodingKeys (stringValue: «ISO8601», intValue: nil)]
Функция декодирования Mi использует стратегию 8601, поэтому она должна прочитать это правильно, и действительно работает нормально с ISO 8601 Дата:
static func decode<T:Decodable>(data:Data, completion: @escaping (Result<T,NetworkError>) -> Void) {
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
let retval = try decoder.decode(T.self, from: data)
completion(.success(retval))
} catch let DecodingError.typeMismatch(type, context) {
var reason = "Type '\(type)' mismatch"
reason += "\nContext: \(context.debugDescription)"
reason += "\nCodingPath: \(context.codingPath)"
completion(.failure(.requestError(reason: reason)))
} catch {
let reason = "Error '\(error.localizedDescription)'"
completion(.failure(.requestError(reason: reason)))
}
}
Что здесь может отсутствовать?