Я пытаюсь получить определенные данные 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
в моем методе didSelectRow
, чтобы я мог использовать WebKit для загрузки 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}
И печать webUrl
успешно печатает все URL, однако они все отдельные, как вы можете видеть здесь:
Из-за этого webView.load(URLRequest(url: webUrl)
получает только один URL (первый) вместо всех, что приводит к ошибке вне диапазона.
Мне интересно, как я могу изменить это, чтобы собрать все url
вместо отдельных.