如何使用委托传递通用可解码数据
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
我已经成功地为我的应用程序创建了一个 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