如何在 SwiftUI 中显示来自 API 的 JSON 数据?

Nac*_*t93 1 api json swift swiftui

我有一个来自 API 的 JSON。我需要将其中的值显示为文本。

这是其中的一部分。

]
    {
        "d": "2019-09-20",
        "v": 56.62
    },
    {
        "d": "2019-09-23",
        "v": 56.93
    }
]
Run Code Online (Sandbox Code Playgroud)

现在,我为它创建了模型,称为Dolar.swift.

struct Dolar: Decodable {
    var d: String?
    var v: Double?
}
Run Code Online (Sandbox Code Playgroud)

还有一个名为的类WebService.swift将处理调用:

class WebService {
    func getCurrency(completion: @escaping (Dolar?) -> ()) {
        guard let url = URL(string: "https://api.estadisticasbcra.com/usd_of") else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data, error == nil else {
                return
            }

            let currencyResponse = try? JSONDecoder().decode(Dolar.self, from: data)

            if let currencyResponse = currencyResponse {
                let dolar = currencyResponse
                print(dolar)
                completion(dolar)
            } else {
                completion(nil)
            }
        }.resume()
    }
}
Run Code Online (Sandbox Code Playgroud)

API 的文档说它需要在请求中添加一个 TOKEN:

Authorization: BEARER {TOKEN}
Run Code Online (Sandbox Code Playgroud)

我怎么做?我有令牌,但不知道如何实现它。这是我的第一个问题。其次,一旦我获得了价值,我该如何在ContentView.swift? 任何帮助表示赞赏。

Chr*_*ris 5

对于问题的第一部分,您需要使用它的变体URLSession.dataTask,需要一个URLRequest. 然后您需要检查响应是否具有有效负载,它可以被解码为您的类型,并且它至少有一个值。就像是:

let request = URLRequest(url: url)
request.setValue(token, forHTTPHeaderField: "Authorization")
// Or maybe:
// request.setValue("BEARER {\(token)}", forHTTPHeaderField: "Authorization")

URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data else {
        return // Couldn't get data from service
    }

    guard let values = JSONDecoder().decode([Dolar].self, from: data) else {
        return  // Couldn't decode data as array of `Dolar`s
    }

    guard let finalValue = values.last else {
        return // No values in data
    }

    // `finalValue` now describes the last element in your array
}.resume()
Run Code Online (Sandbox Code Playgroud)

请参阅URLSessionURLRequest的文档