如何使用委托传递通用可解码数据

How to pass a generic decodable data using a delegate

我已经成功地为我的应用程序创建了一个 APIClient 和路由器,这是我的代码

我的成绩

enum Result<T> {
    case success(data: T)
    case failure(error: Error) }

这是我的服务器请求

func request<T: Decodable>(router: APIRouter, completion: @escaping (Result<T>) -> ()) {

和完成处理程序

completion(Result<T>.failure(error: ErrorResult.defaultError))
completion(Result.success(data: result))

这是我的 viewModel 我得到结果的地方

switch result {
        case .success(let successData):
            print("successData \(successData)")
            self.viewModelDelegate?.didFinishFetchingData(successData)

        case .failure(let errorData):
            print("errorData \(errorData.localizedDescription)")
            self.viewModelDelegate?.didFinishFetchingDataWithFailure?(errorData.localizedDescription)
        }

现在我需要的是使用委托

将可解码的结果传递给我的viewcontroller
@objc public protocol ViewModelDelegate {
func didStartFetchingData()
func didFinishFetchingData(_ result:Decodable)
@objc optional func didFinishFetchingDataWithFailure(_ message:String)
}

这是我所做的,但出现错误

我只需要使用自定义委托将成功数据(可解码数据)从视图模型传递到我的视图控制器

你可以用这个做泛型,看看下面的例子

 func didFinishFetchingData<T: Decodable>(_ result: T)

// example models 
struct Foo: Decodable {

}
struct Boo: Decodable {

}
didFinishFetchingData(Foo())
didFinishFetchingData(Boo())

要根据需要使其可选,只需在 T 中添加 ?

func didFinishFetchingData<T: Decodable>(_ result: T?)

注意:您不能将纯 nil 传递到参数中,但可以传递可空类型的 T 检查下面的代码。

let model = try? JSONDecoder().decode(Foo.self, from: Data()) // model is type of Foo? 
didFinishFetchingData(model) // works fine