Как я могу декодировать и получить доступ к Double с JSON, используя Alamofire и Swift Decode - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь выполнить декодирование и получить доступ к указанному c курсу валюты для указанной c валюты с использованием декодирования Alamofire и Swift:

это моя модель:

    struct Listek: Codable {
    let base: String
    let date: String
    let rates: [String: Double]

    enum CodingKeys: String, CodingKey {
        case base = "base"
        case date = "date"
        case rates = "rates"
    }
}

это Alamofire Вызов API + декодирование

let apiToContact = "https://api.exchangeratesapi.io/latest"
    AF.request(apiToContact).responseJSON { (response) in
    print(response)
    guard let data = response.data else { return }
    do {
    let st = try JSONDecoder().decode(Listek.self, from: data)
        print (st.rates)
        print (st.base)
        print (st.date)

    }
    catch {
    print("error")
    }

Пока все хорошо, но мне не удается получить доступ к единой валюте и ее значению курса. Я хотел бы объявить переменную JPYrate со значением курса JPY от JSON. Можете ли вы провести меня?

Ответы [ 3 ]

1 голос
/ 18 марта 2020

Вы можете просто получить значение, соответствующее ключу JPY из rates Dictionary, например,

let JPYrate = st.rates["JPY"]

Также нет необходимости создавать enum CodingKeys, если имена ключей такие же, как имена свойств. Итак, ваш struct Listek выглядит так,

struct Listek: Codable {
    let base: String
    let date: String
    let rates: [String:Double]
}
0 голосов
/ 18 марта 2020

Во-первых, вы можете создать вычисляемое свойство для доступа к курсу JPY:

var jpyRate: Double? { rates["JPY"] }

Или проанализировать ставки в конкретный тип c, рекомендованный @ vadian.

Второй Вы можете использовать метод Alamofire responseDecodable для автоматического декодирования.

AF.request(apiToContact).responseDecodable(of: Listek.self) { response in
    debugPrint(response)
}
0 голосов
/ 18 марта 2020

exchangeratesapi, похоже, отправляет непротиворечивые данные. в таком случае я предлагаю декодировать ставки в выделенную структуру

struct Listek: Decodable {
    let base: String
    let date: String
    let rates: Rates
}

struct Rates: Decodable {
    let CAD, HKD, ISK, PHP, DKK, HUF, CZK, AUD, RON, SEK, IDR, INR, BRL, RUB, HRK, JPY, THB, CHF, SGD, PLN, BGN, TRY, CNY, NOK, NZD, ZAR, USD, MXN, ILS, GBP, KRW, MYR : Double
}

. Тогда вы можете получить ставку напрямую

print(st.rates.JPY)
...