Как передать тип в функцию с помощью вызова с универсальным типом в Swift - PullRequest
0 голосов
/ 17 июня 2019

вызов функции с обработчиком завершения со значением generics дал ошибку в xcode относительно универсального типа, определение функции:

 func loadData<T: Codable>(params: parameters, completion: @escaping (resultados<T>) -> Void) {
    let request = requestManager()
    request.post(params: params, with: {result in
        switch result{
        case .success(let data):
            do {
                let mydata = try JSONDecoder().decode(T.self, from: data)
                completion(.datos(Dato: mydata))
            }
            catch{
                completion(.error(Error: error))
            }
        case .failure(let error):
            completion(.error(Error: error))
        }
    })
}

где resultados - это enum, как это:

    enum resultados<T>{
    case datos(Dato: T)
    case error(Error: Error)
    }

функция делает запрос и декодирует базы ответов по типу T. но при вызове функции как можно определить универсальный тип, потому что этот код не работает:

let dat = dataLoader()
dat.loadData<T:productResponse>(params: parameters.Endpoint(endpoint: end), completion:{ result in
            switch result{
            case .datos(let Dato):
                self.mydata = Dato as? productResponse
                self.stopanAnimation()
                DispatchQueue.main.async {
                    self.performSegue(withIdentifier: "showResult", sender: self)
                }
            case .error(let error):
                self.stopanAnimation()
            }
        })

с тех пор как xcode сказал enter image description here и удалив T чтобы оставить вот так dat.loadData<productResponse>(params: parameters.Endpoint(endpoint: end), completion:{ result in тогда xcode говорит

Невозможно явно специализировать универсальную функцию

EDIT: весь смысл этого вопроса состоит в том, чтобы попытаться компилятор иметь возможность выводить тип или, чтобы не сказать, каков тип enum со значением generics, так как параметры функции не имеют тип обратного вызова внутри enum. можно сделать вывод, код, который не работает, но выразить то, что я имею в виду.

func loadData<T:Codable>(params: parameters,completion: @escaping (resultados<T>) -> Void)

, поскольку resultados - это enum с генериками, соответствующими кодируемым. Я хотел бы вызвать функцию таким образом, чтобы я мог передать тип декодирования. как то так

    let dec = dataLoder()
    dec.dataLoader<T:productResponse>(params: parameters,completion: { result in)
result in the completion is another enum with this format:

    enum resultados<T>{
    case datos(Dato: T)
    case error(Error: Error)
    }
so i have to swich the enum and obtain the decoded value. guess this is not posible in swift with the above o any other way for the compiler reconigze it.




1 Ответ

0 голосов
/ 17 июня 2019

Определите определенную функцию-обработчик:

func resultadosHandler(resultados: resultados<productResponse>) { // productResponse is the type you expect
    switch resultados {
    case .datos(let dato): print(dato)
    case .error(let error): print(error)
    }
}

Передайте ее в функцию загрузчика:

dat.loadData(params: parameters.Endpoint(endpoint: end), completion: resultadosHandler)

Или, если хотите, вы можете использовать ее в встроенном режиме следующим образом:

loadData(params: parameters.Endpoint(endpoint: end)) { (resultados: resultados<productResponse>) in
    switch resultados {
    case .datos(let dato): print(dato)
    case .error(let error): print(error)
    }
}

Не забудьте заменить отпечатки правильной реализацией!

...