Если вы не можете изменить API (предпочтительный подход), вы можете использовать enum
со связанными значениями, представляющими каждый тип результата.
Итак, для примера, давайте предположим, что вы получите следующие два типа результатов:
Случай успеха:
{ "value": 5.2 }
Случай отказа:
{ "value": {} }
Затем вы можете декодировать это с помощью перечисления, например :
enum Result: Decodable {
case success(Float)
case error
enum CodingKeys: CodingKey { case value }
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
if let value = try? container.decodeIfPresent(Float.self, forKey: .value) {
self = .success(value)
} else {
self = .error
}
}
}
Затем вы можете декодировать и извлечь число:
let result = try JSONDecoder().decode(Result.self, from: json)
if case let .success(value) = result {
print(value) // 5.2
}