2017-02-02 2 views
0

제네릭 매개 변수로 enum을 사용하여 제네릭 함수를 만들려고합니다.제네릭 함수에서 enum 사용

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의 선언을 참조 아래 :

var에 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에 대한 경험이 없으므로 Moya의 작동 방식과 달성하려는 목표를 알 수는 없지만 형식을 기능에 전달하려는 것처럼 보입니다. 그래서 당신은 같은 것을 수행해야하는 경우 :

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

    ... 

    return RxMoyaProvider<T>(endpointClosure: endpointClosure) 
} 

을하고 .self로 전화 :

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

을하지만 유일한 문제가 아니다.

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

: 당신은 어떻게 baseURL 속성을 것 <T>을 입력 문맥없이 알 수 있습니까?

전반적인 아키텍처가 엉망인 것 같아서 다시 생각해 보겠습니다.

+0

팁을 보내 주셔서 감사합니다. TargetType은 항상 baseURL의 속성을 가진 Moya 내부의 클래스입니다. 그래서 나는이 대답을 받아 들일 것입니다! – Steaphann

+0

음, TargetType으로 나쁘다! 어쨌든 도와 줘서 기쁩니다 :) –