访问[Struct]

时间:2018-11-14 16:44:42

标签: swift struct

我正在尝试获取某些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]()

可以访问StockQuote的属性,但是我在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,但是它们都是分开的,如您在此处看到的那样:

enter image description here

因此,webUrl仅获得一个url(第一个),而不是所有url,从而导致超出范围的错误。

我想知道如何更改此设置以使所有webView.load(URLRequest(url: webUrl)在一起而不是分开。

1 个答案:

答案 0 :(得分:1)

好的,所以从根本上说,如果我理解正确的话,就很难遍历一个数组,这里就是:

var urls = [String]()
stock.news.forEach { urls.append($0.url) }
print(urls)