索引超出范围错误,即使值的数量与行数匹配

时间:2018-11-16 17:39:09

标签: ios swift uitableview

我正在尝试将一些图像设置为表视图中的图像视图,并且将行数设置为return keys.count,在打印后确认为5,这是完美的。

现在在cellForRowAt中,我将images放入数组中,然后尝试将图像设置为单元格的图像视图。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    if indexPath.section == 0 {
        let cell = tableView.dequeueReusableCell(withIdentifier: "stockCell", for: indexPath) as! StockCell

        let stock = stockData[keys[indexPath.row]]!

        var images = [String]()
        stock.news.forEach { images.append($0.image) }
        print("\n\nNumber of Images: \(images.count)\n\n\n")

        if let companyImageUrl = URL(string: images[indexPath.row]) {
            ImageService.getImage(url: companyImageUrl) { (image) in
                cell.companyLogoImageView.image = image
            }
        }

        return cell
    }
}

我在其中放置了一条打印语句以打印images.count(应该有5个),但是控制台显示2,然后是5(x3),然后又是2-这导致索引超出范围错误大概是2,应该有5:

enter image description here

images.count为什么在首尾显示2,而在其余位置显示5

编辑:其余代码

获取数据(在viewDidLoad中):

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

数据设置为字典,并为键设置一个单独的数组:

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

用于解码JSON的结构:

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
}

2 个答案:

答案 0 :(得分:0)

添加另一份印刷品,并确保每一行的新闻数量也不同。然后找出它与众不同的原因。

stock.news.forEach { images.append($0.image) }
print("\n\nNumber of Images: \(images.count)\n\n\n")
print("\n\nNumber of stock.news: \(stock.news.count)\n\n\n")

答案 1 :(得分:0)

您假设您有5张图片,因为keys.count是5,这是错误的,因为keys.count告诉您从json消息创建的字典中有5张股票。

现在每只股票都附有一个新闻数组,我假设它包含一天或类似时间与该股票相关的新闻文章/消息,因此该数组可能包含从0到无限(不太可能)数量的新闻文章。 (在这种情况下,文章数在2到5之间)。

无论如何,您在读取新闻数组时不能依靠keys.count,而是要对每个数组进行检查news.count

因此需要更改此代码,但我不确定如何

if let companyImageUrl = URL(string: images[indexPath.row]) {
        ImageService.getImage(url: companyImageUrl) { (image) in
            cell.companyLogoImageView.image = image
        }
}

您将显示所有图像吗?那么您需要以某种方式将其包围起来,但是我感觉到您只想显示一张图像,因此可以将URL(string: images[indexPath.row])更改为URL(string: images[0])