Ваш ответ в параметре data
должен быть массивом, а не словарем.Вы не сможете перебирать словарь по неопределенным ключам.Было бы хорошо, чтобы ваш ответ API обновлялся в первую очередь.
Но, если вы хотите продолжить работу с существующим ответом API, сначала вам нужно преобразовать свой ответ в массив и использовать ваш Decodable
выглядит как:
struct Coin: Decodable {
var id: String
var symbol : String
var name : String
var priceAUD : QuoteStruct
private enum CodingKeys: String, CodingKey {
case id = "rank", symbol, name, priceAUD = "quotes"
}
}
struct QuoteStruct: Decodable {
let aud : PriceStruct
}
struct PriceStruct: Decodable {
let price : String
}
Обновите анализ данных в блоке API следующим образом:
guard let responseData = data else { return }
do {
let json = try? JSONSerialization.jsonObject(with: responseData, options: [])
if let jsonData = json as? [String: Any], let dataObject = jsonData["data"] as? [Int: Any] {
let coinArray = dataObject.map { $0.1 }
if let jsonData = try? JSONSerialization.data(withJSONObject: coinArray, options: .prettyPrinted) {
coins = try JSONDecoder().decode([Coin].self, from: jsonData)
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
} catch {
print("Error is : \n\(error)")
}