Задать вопрос
@shevzoom
 dev., student at MEPhI

Как правильно положить параметры в completion escaping, не уничтожив filter?

у меня есть структура:
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.
  • Вопрос задан
  • 46 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
briahas
@briahas
ObjC, Swift, Python
Извините, но по моему вы уже запутались в своих алгоритмах. Вы же понимаете что нельзя присвоить значение типа А переменной типа Б, да? Однако, пытаетесь делать это и удивляетесь когда компилятор ругается.

Если вам надо поменять тип выходного параметра у функции - логично, что надо поменять и те функции которые его принимают.

Лучше вас ни кто не знает - что вам нужно. Если вам надо возвращать IsResult - возвращайте его, если надо [IsResult] - возвращайте его, если надо [ResultItem] - то его.

Мне кааааажется, что вы все таки запутались уже в логике.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы