у меня есть структура:
struct APIResponce: Codable {
let result: IsResult
}
struct IsResult: Codable {
let items: [ResultItem]
let lastID: Int
let lastSortingValue: Double
enum CodingKeys: String, CodingKey {
case items
case lastID = "lastId"
case lastSortingValue
}
}
Функция для парсинга:
public func getTopStories(lastID: Int = 0, lastSortingValue: Double = 0, completion: @escaping (Result<[ResultItem], Error>)
do {
let json = try JSONDecoder().decode(APIResponce.self, from: data)
let obj = json.result.items.filter{$0.data != nil}
completion(.success(obj))
}
Ну, чтобы достать значения lastID, я заменил
(Result<[ResultItem], Error>)
на
(Result<[IsResult], Error>)
и в блоке do соотвественно надо положить
do {
let json = try JSONDecoder().decode(APIResponce.self, from: data)
// filter не работает т.к obj становится [ResulItem] , а completion [IsResult]
// let obj = json.result.items.filter{$0.data != nil}
completion(.success([json.filter]))
}
Есть еще идея обработать полученный результат во ViewController, но там словил много ошибок по типу:
cannot asign [ResultItem] expect [IsResult]
Я закоментировал идею:
private var result = [ResultItem]()
// private var pag = [IsResult]()
private var viewModels = [NewsTableViewCellViewModel]()
private var id = 0
private var sortVal = 0.0
}
}
}
private func fetchTopStories() {
APICaller.shared.getTopStories(lastID: id, lastSortingValue: sortVal) { [weak self] json in
switch json {
case .success(let result):
// case .success(let pag):
// self?.pag = result.items // компилятор ругается
// self?.viewModels = result.items.compactMap({ viewModels in // компилятор ругается
self?.result = result
self?.viewModels = result.compactMap({ viewModels in
// guard let uuid = viewModels.data?.blocks?.first(where: {$0.data.text == nil && $0.data.items != nil})?.data.items?.first?.image?.data?.uuid else { return nil }
// return NewsTableViewCellViewModel(
// name: viewModels.data?.subsite?.name ?? "unknown",
// author: viewModels.data?.author?.name ?? "No name",
// title: viewModels.data?.title ?? "NO TITLE",
// subtitle: viewModels.data?.blocks?.first?.data.text ?? "",
// imageURL: URL(string: "https://leonardo.osnova.io/\(uuid.uuidString.lowercased())")
// )
})
DispatchQueue.main.async {
self?.tableView.reloadData()
}
// self?.id = pag.first?.lastID ?? 0
// self?.sortVal = pag.first?.lastSortingValue ?? 0
case .failure(let error):
print(error)
Сам вопрос: можно ли "безболезнено" добавить к [ResultItem] который я кладу в complition параметры lastID и lastSortingValue?
Или придется менять весь escaping класть в complition [IsResult]? Если так, то не знаю, возможно ли в нем будет отфильтровать пришедшие данные от nil и положить в complition.