我正在尝试获取某些JSON数据以填充表视图,而且我不确定如何在不遇到索引超出范围错误的情况下访问这些属性。
我从IEX API(JSON)获取数据:
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()
}
}
并使用这些结构进行解码:
struct Welcome: Decodable {
let aapl, fb, msft, tsla, goog: Stock
enum CodingKeys: String, CodingKey {
case aapl = "AAPL"
case fb = "FB"
case msft = "MSFT"
case tsla = "TSLA"
case goog = "GOOG"
}
}
struct Stock: 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
}
结果数据设置为字典,并且有一个keys
变量,因此我可以访问键:
var stockData = [String:Stock]()
var keys = [String]()
可以访问Stock
和Quote
的属性,但是我在News
中有一个Stock
结构的数组,这让我大吃一惊。我的目标是在我的url
方法中使用News
的{{1}}属性,以便在轻按一个单元格时可以使用WebKit加载公司的didSelectRow
:
url
如您所见,我已经尝试使用
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let stock = stockData[keys[indexPath.row]]!
guard let webUrl = URL(string: stock.news[1].url) else {return}
print("\n\n\nwebUrls:\n\n\n\n\n\(webUrl)\n\n\n\n")
let webController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "webController") as! WebViewController
webView.load(URLRequest(url: webUrl))
webController.view = webView
self.navigationController?.pushViewController(webController, animated: true)
}
然后打印guard let webUrl = URL(string: stock.news[1].url) else {return}
会成功打印所有URL,但是它们都是分开的,如您在此处看到的那样:
因此,webUrl
仅获得一个url(第一个),而不是所有url,从而导致超出范围的错误。
我想知道如何更改此设置以使所有webView.load(URLRequest(url: webUrl)
在一起而不是分开。
答案 0 :(得分:1)
好的,所以从根本上说,如果我理解正确的话,就很难遍历一个数组,这里就是:
var urls = [String]()
stock.news.forEach { urls.append($0.url) }
print(urls)