gpt4 book ai didi

swift - 使用完成处理程序调用函数

转载 作者:行者123 更新时间:2023-12-05 05:49:29 26 4
gpt4 key购买 nike

我创建了下面的函数,但我不确定如何调用它,它提示说:

Type 'T.Type' cannot conform to 'Decodable' 

我想这样调用它:

let result = getApiData(modelToDecode: MyModel, url: "abc")

这是我试过的:

func getApiData<T : Decodable>(modelToDecode: T.Type, url: String) -> Any? {
// I get an error below
fetchDataAndDecode(url: String, modelToDecode: T.Type) { result in
}

// temp placeholder
return nil
}

func fetchDataAndDecode<T : Decodable>(url: String, modelToDecode: T.Type, completionHandler: @escaping (Result<T.Type, NetworkError>) -> Void) {
guard let url = URL(string: url) else {
completionHandler(.failure(NetworkError.badURL))
return
}

AF.request(url, method: .get).validate().responseData { response in
guard let data = response.data else {
completionHandler(.failure(NetworkError.apiFailed))
return
}

do {
// Decode the data
let decodedData = try JSONDecoder().decode(modelToDecode.self, from: data)
DispatchQueue.main.async {
completionHandler(.success(decodedData as! T.Type))
}
} catch(let error) {
print("🛑 Error on afRequest(): \(error)")
}
}
}

如何在类里面正确调用它?

最佳答案

结果应为 Result<T, NetworkError> .无需添加 modelToDecode到你的方法声明。您可以在异步调用中显式设置结果类型。顺便说一句,如果您无法解码数据,您也应该使用完成处理程序:

enum NetworkError: Error {
case badURL, apiFailed, corruptedData
}

你的方法应该是这样的:

func fetchDataAndDecode<T: Decodable>(url: String, completionHandler: @escaping (Result<T, NetworkError>) -> Void) {
guard let url = URL(string: url) else {
completionHandler(.failure(.badURL))
return
}

AF.request(url, method: .get).validate().responseData { response in
guard let data = response.data else {
completionHandler(.failure(.apiFailed))
return
}

do {
let decodedData = try JSONDecoder().decode(T.self, from: data)
DispatchQueue.main.async {
completionHandler(.success(decodedData))
}
} catch {
completionHandler(.failure(.corruptedData))
}
}
}

并且在调用它时你需要显式设置结果类型:

fetchDataAndDecode(url: "yourURL") { (result: Result<WhatEver, NetworkError>) in 
// switch the result here
}

关于swift - 使用完成处理程序调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70660604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com