Ошибка SwiftUI URLSession при получении данных (typeMismatch) WEBAPI - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь извлечь данные из URL, как только я нажал кнопку и вызвал функцию, но как только функция вызвана, я продолжаю получать ошибку typeMismatch.

Это мой код:

struct User: Decodable {
    var symbol: String
    var price: Double
}

struct Response: Decodable {
    var results:[User]
}


struct ContentView: View {
    var body: some View {
        VStack {
            Text("hello")
            Button(action: {
                self.fetchUsers(amount: 0)
            }) {
                Text("Button")
            }
        }

    }

    func fetchUsers(amount: Int) {
        let url:URL = URL(string: "https://api.binance.com/api/v3/ticker/price")!

        URLSession.shared.dataTask(with: url) { (data, res, err) in
            if let err = err { print(err) }
            guard let data = data else { return }
            do {
                let response = try JSONDecoder().decode(Response.self, from: data)
                print(response.results[0])
            } catch let err {
                print(err)
            }
        }.resume()
    }

}

Это ошибка:

typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))

URL-адрес веб-сайта, с которого я пытаюсь получить данные: https://api.binance.com/api/v3/ticker/price

enter image description here Я пытаюсь получить указанную c цену из указанного c символа, например, цену ETHBT C, которая будет 0,019 ...

Спасибо

1 Ответ

0 голосов
/ 08 марта 2020

В этом подходе есть две ошибки. Прежде всего, если вы создали структуру Response с

results = [User]

таким образом, вы ожидаете, что json будет иметь вид [result: {}], но у вас есть формат [{}] без имя при рождении. Таким образом, вы должны заменить структуру ответа на

typealias Response = [User]

Во-вторых, все, что вы используете для API - это возвращение строки вместо double в качестве цены, поэтому вы должны изменить свою структуру следующим образом:

struct User: Decodable {
    var symbol: String
    var price: String
}

Таким образом, это сработало для меня. Протестировано под

  • swift 5
  • xcode 11.3.1
  • iOS 13.3.1 без бета
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...