Я пытаюсь получить данные о запасах из финансового API IEX, и все, что мне нужно, это просто вывод на консоль, но у меня возникают проблемы при попытке использовать эти данные для подключения к моему табличному представлению.
Это URL-адрес API , а также JSON в удобочитаемом формате .
Это структуры, которые я создал
struct Welcome: Decodable {
let aapl, fb, msft, tsla, goog: Aapl
enum CodingKeys: String, CodingKey {
case aapl = "AAPL"
case fb = "FB"
case msft = "MSFT"
case tsla = "TSLA"
case goog = "GOOG"
}
}
struct Aapl: Decodable {
let quote: Quote
let news: [News]
}
struct Quote: Decodable {
let symbol: String
let companyName: String
let latestPrice: Double
}
struct News: Decodable {
let url: String
let image: String
}
Вот как данные выбираются:
fetchData(url: stockApiUrl) { (result: FetchResult<Welcome>) -> (Void) in
switch result {
case .success(let object): self.stockData = [object]
print("stockData: \n\n\(self.stockData)")
case .failure(let error):
print("Error decoding JSON: \n\n\(error)")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
И передать данные в
var stockData = [Welcome]()
Имея код, который есть сейчас, он выводит все данные, которые мне нужны для компаний, но я не совсем понимаю, как получить доступ ко всем данным компании, чтобы я мог получить каждый кусок (companyName
, latestPrice
и т. д.) по отдельности, чтобы я мог отобразить их в виде таблицы.
Например, в моем методе cellForRowAt
табличного представления я пытаюсь установить companyName
для меток, но использование let quotes = stockData[indexPath.row]
дает мне индекс вне диапазона ошибок, поэтому я не могу тогда использовать что-то вроде cell.companyNameLabel = quotes[indexPath.row].companyName
.
Мне интересно, нужно ли мне реструктурировать свои структуры (хотя я сравнил свой код с предложенным кодом из quicktype.io и он идентичен) или переделать что-то еще.
Спасибо за любые советы!
EDIT:
numberOfRows
метод:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if section == 0 {
return stockData.count
} else if section == 1 && fetchingMore {
return 1
}
return 0
}
fetchData
функция:
func fetchData<T: Decodable>(url: URL, completion: @escaping (FetchResult<T>) -> (Void)) {
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {completion(.failure(error!)); return}
do {
//let object = try JSONDecoder().decode(T.self, from: data)
let object = try? JSONDecoder().decode([String:Aapl].self,from: data)
completion(.success(object))
} catch {
completion(.failure(error))
}
}.resume()
}