gpt4 book ai didi

ios - 尝试从结构访问 JSON 数据时出现索引超出范围错误

转载 作者:搜寻专家 更新时间:2023-11-01 06:56:02 27 4
gpt4 key购买 nike

我正在尝试从 IEX 金融 API 获取股票数据,我需要的一切都可以很好地输出到控制台,但我在尝试使用该数据插入我的 TableView 时遇到了问题。

这是API url , 这是 JSON in a readable format .

这些是我设置的结构

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 = [欢迎]()

使用现在的代码,它输出公司所需的所有数据,但我对如何访问所有公司数据感到困惑,以便我可以获取每个数据(companyNamelatestPrice 等),以便我可以在表格 View 中显示它们。

例如,在我的 cellForRowAt TableView 方法中,我尝试将 companyName 设置为标签,但使用 let quotes = stockData[indexPath.row] 给我一个索引超出范围的错误,所以我不能再使用像 cell.companyNameLabel = quotes[indexPath.row].companyName 这样的东西。

我想知道我是否需要重组我的结构(尽管我将我的代码与 quicktype.io 中建议的代码进行了比较,发现它们是相同的),或者重新做一些其他事情。

感谢您的指导!

编辑:

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()
}

最佳答案

要使用更通用和更具描述性的名称,请将 Aapl 重命名为 Stock

struct Stock: Decodable {
let quote: Quote
let news: [News]
}

stockData 声明为字典并为键创建一个数组

var stockData = [String:Stock]()
var keys = [String]()

fetchData替换为

fetchData(url: stockApiUrl) { (result: FetchResult<[String:Stock]>) -> (Void) in
switch result {
case .success(let object):
self.stockData = object
self.keys = Array(object.keys)
print("stockData: \n\n\(self.stockData)")
case .failure(let error):
print("Error decoding JSON: \n\n\(error)")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
}

cellForRow中写入

let stock = stocks[keys[indexPath.row]]!
cell.companyNameLabel = stock.quote.companyName

关于ios - 尝试从结构访问 JSON 数据时出现索引超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53287554/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com