Как обратиться к массиву в другом массиве при вызове ViewModelCell?

customtableviewcell
api
tableviewcell

#1

, столкнулся с проблемой, после изменения API.

  • Как обратиться к “подмасивам”?

Ранее, я получал один массив, который содержал в себе все объекты.
Теперь каждый объект, который я кладу во ViewModel, находится в подмассиве.
Спасибо.

struct APIResponce: Codable {
let result: IsResult
}
struct IsResult: Codable {
    let items: [ResultItem]
    let lastID, lastSortingValue: Int
    
    enum CodingKeys: String, CodingKey {
        case items
        case lastID = "lastId"
        case lastSortingValue
    }
}

struct ResultItem: Codable {
    let data: DataData
}

struct DataData: Codable {
    let author: SubsiteClass
    let title: String?
    let blocks: [Block]?
    let subsite: SubsiteClass
    
    enum CodingKeys: String, CodingKey {
        case author
        case subsite, title, blocks
    }
}

// MARK: - SubsiteClass / Раздел. (ex. "Новости")
struct SubsiteClass: Codable {
    let name: String
}

struct Block: Codable {
    let data: BlockData
//    let cover: Bool
}

// MARK: - BlockData / subtitle - подзаголовок статьи
struct BlockData: Codable {
    let text : String?
}

#2

Покажите чистый json ответ как было раньше и как стало теперь.
У вас subsites это массив, а вам нужен string, т.е. тут что-то не так. Либо брать всегда первый элемент, либо что-то не так с логикой.
Аналогично с subtitle, block это тоже массив, но вам нужен string. При этом сама модель Block не содержит свойства с типом string.


#3

Подредактировал пост, сейчас я не могу обратиться к переменной text, которая лежит в массиве blocks. Остальное, не факт, что верно, но подправил.

А как мне скинуть JSON? Он большой и до ветки с объектами “Block” , не могу уместить на скриншоте, могу ссылку дать разве что.


#4

subtitle: $0.data.blocks[0].data.text


#5

Спасибо! Добавил буквально только
subtitle: $0.data.blocks?.first?.data.text ?? "no title"
и ошибка ушла.


#6

А вы не знаете из-за чего могла декодировака json слететь?
Я подложил в аргумент функции новую структуру, а dump пустой, мне пришел nil.

    public func getTopStories(completion: @escaping (Result<isResult, Error>) -> Void) {
    
    guard let url = Constants.topHeadlinesURL else {
        return
    }
    
    let task = URLSession.shared.dataTask(with: url) {data, _, error in
        
        if let error = error {
            completion(.failure(error))
        }
        else if let data = data {
            
            do {
                let json = try JSONDecoder().decode(APIResponce.self, from: data)
                completion(.success(json.result))
                print("news: \(json.result.items.count)")
                dump(json.result)
            }
            catch {
                completion(.failure(error))
            }
        }
    }
    task.resume()
}

}


#7

не могу сказать, я не видел json


#8

Могу попробовать показать, подскажите?
Вот свернутый:
{
“message”: “”,
“result”: {
“items”: […],
“lastId”: 416779,
“lastSortingValue”: 1627541770
}
}
Могу показать на картинке:

роут: https://api.tjournal.ru/v2.0/timeline


#9
struct ResultItem: Codable {
    let data: [DataData]
}

должно быть