我尝试将网络模型加载到每个控制器中,而不是将其抽象到一个控制器ModelLoader中
这是我到目前为止想出来的:
protocol ModelLoaderDelegate: class {
func didFetch(model: Any)
func modelFailedToFetch(errorMessage: String)
}
final class ModelLoader<ModelType> {
let api: API
weak var delegate: ModelLoaderDelegate?
private let client = dependencies.client
init(api: API) {
self.api = api
}
func fetchModel() {
client.performRequest(api: api, decodeTo: ModelType.self, completion: { result in
switch result {
case .success(let value):
self.delegate?.didFetch(model: value)
case .failure(let error):
self.delegate?.modelFailedToFetch(errorMessage: error.localizedDescription)
}
})
}
}到目前为止,我还不能做的一件事是将ModelLoaderDelegate的didFetch方法中的Any替换为类似泛型的参数。
我试着这样做:
func didFetch<T>(info: T)但是在委托的实现者中:
func didFetch<T>(info: T) {
// I need a concerete type here not a generic
}找不到其他方法。
发布于 2019-08-26 16:14:24
取而代之的是通过委托来实现,你可以通过闭包来创建逻辑:
final class ModelLoader<ModelType> {
let api: API
private let client = dependencies.client
init(api: API) {
self.api = api
}
func fetchModel<ModelType>(completion: @escaping (Result<ModelType, Error>) -> ()) {
client.performRequest(api: api, decodeTo: ModelType.self, completion: { result in
switch result {
case .success(let value):
completion(.success(value))
case .failure(let error):
completion(.failure(error))
}
})
}
}我认为使用这种方法将更容易处理响应:)
https://stackoverflow.com/questions/57653873
复制相似问题