Я пытаюсь практиковать Swift Codable API. Я отправляю сетевой запрос и каждый раз получаю одну строку, как показано ниже, где мне нужно иметь дело с динамическими ключами:

Пример ответа 1:

{
  "EUR": 4695.01
}

Пример ответа 2:

{
  "USD": 479.01
}

Пример ответа 3:

{
  "BTC": 4735.01
}

Я попробовал этот метод для анализа динамических ключей:

struct ConversionResponseModel: Decodable {
    typealias destinationCurrency = String
    
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
    }
}

И мой запрос на получение:

do {
    let myResult = try JSONDecoder().decode(ConversionResponseModel.self, from: data)
                print(myResult)
            } catch {
                print(error)
            }

Но в результате я получаю следующее: ConversionResponseModel(), а не значения валюты. Похоже, я что-то упускаю. Любая помощь, пожалуйста. Спасибо

0
Elitia Universe 22 Фев 2021 в 00:40

1 ответ

Лучший ответ

Ты почти там. Полученный вами JSON вернет словарь [String:Double]. Затем вы можете скрыть это, используя:

struct ConversionResponseModel: Decodable {
    typealias DestinationCurrency = String
    
    let currency : DestinationCurrency
    let value : Double
    
    init(from decoder: Decoder) throws {
        let container = try decoder.singleValueContainer()
        let dict = try container.decode([String:Double].self)
        guard let key = dict.keys.first else {
            throw NSError(domain: "Decoder", code: 0, userInfo: [:])
        }
        currency = key
        value = dict[key] ?? -1
    }
}

Примечание: принимая во внимание комментарий Роба Напьера, вы можете заменить Double Decimal - см. его комментарий к исходному вопросу для более подробной информации

2
jnpdx 21 Фев 2021 в 22:07