Я пытаюсь установить для некоторых изображений представления изображений в виде таблицы, и у меня установлено число строк 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
}
}
Я поместил туда оператор print, чтобы вывести images.count
(должно быть 5), но консоль показывает 2, затем 5 (x3), затем снова 2 - это вызывает ошибку индекса вне диапазона, предположительно, он видит 2, когда должно быть 5:
Почему 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
}