2017-02-02 4 views
0

Я хочу создать общую функцию с перечислением как общие параметры. У меня есть следующие общие функции:Использование перечисления в общей функции

func buildProvider<T>(service: T) -> RxMoyaProvider<T> { 

    let endpointClosure = { (target: T) -> Endpoint<T> in 
     let url = target.baseURL.appendingPathComponent(target.path).absoluteString 
     let endpoint = Endpoint<T>(URL: url, sampleResponseClosure: {.networkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters) 
     return endpoint 
    } 

    return RxMoyaProvider<T>(endpointClosure: endpointClosure) 
} 

Я называю это так:

self.userProvider = buildProvider(service: UserService) 

Ниже вы видите декларацию userProvider:

уаг userProvider: RxMoyaProvider?

А ниже вы видите пример UserService:

import Foundation 
import Moya 

enum UserService { 
    case login(qrKey: String, language: String, fcmToken: String) 
} 

extension UserService: TargetType { 

    var baseURL: URL { 
     let appConfig = AppConfig() 
     let hostname = try! appConfig.hostname() 

     return URL(string: hostname)! 
    } 
    var path: String { 
     switch self { 
     case .login(_,_,_): 
      return "/v1/login" 
     } 
    } 
    var method: Moya.Method { 
     switch self { 
     case .login(_,_,_): 
      return .post 
     } 
    } 
    var parameters: [String: Any]? { 
     switch self { 
     case .login(let qrKey, let language, let fcmToken): 
      let params = ["qr-key": qrKey, "language": language, "os": "ios", "fcm-token": fcmToken] 
      return params 
     } 
    } 
    var sampleData: Data { 
     switch self { 
     case .login(_, _, _): 
      return "".data(using: .utf8)! 
     } 
    } 
    var task: Task { 
     return .request 
    } 
} 

И я получаю следующее сообщение об ошибке:

Cannot convert value of type 'UserService.Type' to expected argument type 'UserService' 

Может кто-то помочь мне с этим?

Спасибо!

+0

На какой точной строке вы получите эту ошибку? –

ответ

0

У меня нет опыта работы с Moya и я не знаю точно, как это работает и чего вы пытаетесь достичь, но похоже, что вы пытаетесь передать тип в функцию. Если так что вы должны сделать что-то вроде:

func buildProvider<T>(service: T.Type) -> RxMoyaProvider<T> { 

    ... 

    return RxMoyaProvider<T>(endpointClosure: endpointClosure) 
} 

и назвать его .self:

self.userProvider = buildProvider(service: UserService.self) 

, но это не единственная проблема. Как вы знаете, без контекста, что печатает <T> бы baseURL недвижимости:

let endpointClosure = { (target: T) -> Endpoint<T> in 
    let url = target.baseURL.appendingPathComponent(target.path).absoluteString 

?

Похоже, вы перепутались с общей архитектурой, и я бы настоятельно советовал пересмотреть ее.

+0

Спасибо за подсказку, заставил ее работать. TargetType - это класс внутри Moya, который всегда имеет свойство baseURL. Поэтому я собираюсь принять этот ответ! – Steaphann

+0

ну, мой плохой с TargetType! в любом случае рад помочь :) –