HttpService 通用协议:
import Foundation
import Moya
protocol HttpService {
associatedtype T
associatedtype D
typealias ResultClosure<D> = (Result<D, Moya.MoyaError>) -> Void
typealias ActivityClosure = ((_: NetworkActivityChangeType) -> Void)?
static func request(
_ target: T,
completion: @escaping ResultClosure<D>,
progress: ProgressBlock?,
activity: ActivityClosure
) -> Cancellable
}
MoyaHttpService 继承 HttpService 协议:
final class MoyaHttpService: HttpService {
typealias D = Decodable
typealias T = TargetType
func request<D: Decodable, T: TargetType>(
_ target: T,
completion: @escaping ResultClosure<D>,
progress: ProgressBlock?,
activity: ActivityClosure
) -> Cancellable {
let provider = MoyaProvider<T>(endpointClosure: { (target: T) -> Endpoint in
let endpoint = MoyaProvider.defaultEndpointMapping(for: target)
//Configuration here
return endpoint
})
return provider.request(target, progress: progress) { (result) in
switch result {
case .success(let response):
guard [200, 201].contains(response.statusCode) else {
completion(.failure(MoyaError.statusCode(response)))
return
}
guard let obj: D = try? JSONDecoder().decode(D.self, from: response.data) else {
completion(.failure(MoyaError.jsonMapping(response)))
return
}
completion(.success(obj))
case .failure(let error):
completion(.failure(error))
}
}
}
}
VIPER > 交互器类:
let service=MoyaHttpService()
service.request(AuthenticationRouter.getLoginData(request: req), completion: {_ in }, progress: nil, activity: nil)
如何在这里调用请求函数?我调用 service.request() 错误。
或者:
service.request<GetLoginDataResponse,AuthenticationRouter>(AuthenticationRouter.getLoginData(request: req), completion: {_ in }, progress: nil, activity: nil)
给我错误:无法明确专门化泛型函数
无法推断通用参数“D”