Доступ к свойствам [Struct] - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь получить определенные данные 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, однако они все отдельные, как вы можете видеть здесь:

enter image description here

Из-за этого webView.load(URLRequest(url: webUrl) получает только один URL (первый) вместо всех, что приводит к ошибке вне диапазона.

Мне интересно, как я могу изменить это, чтобы собрать все url вместо отдельных.

1 Ответ

0 голосов
/ 15 ноября 2018

хорошо, поэтому в основном вы пытаетесь перебрать массив, если я правильно понимаю, вот вам:

var urls = [String]()
stock.news.forEach { urls.append($0.url) }
print(urls)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...