1

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”

4

0 回答 0