вызов функции с обработчиком завершения со значением 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 сказал
и удалив 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.