2016-03-29 20 views
0

我有此稱爲結果的數據類型它包裝類型和進展問題與通用轉換方法使用RxSwift

public enum <T> { 
    case Success(T) 
    case Progress(CGFloat) 
} 

class func rx_request(router: Router) -> Observable<<AnyObject>> 

這需要AnyObject被變換成一個Mappable結構(ObjectMapper),所以因爲我有幾個的這些可映射結構,我想實現這樣的事情,一個通用的地圖,我可以使用:

class func rx_convert<T : Mappable>(value: <AnyObject>) -> Observable<<T>> { 

     return Observable.create { observer in 

      switch value { 
      case .Success(let object): 
       guard let convertedObject = Mapper<T>().map(object) else { 
        observer.onError(NetworkError.IncorrectDataReturned) 
        return NopDisposable.instance 
       } 

       observer.on(.Next(<T>.Success(convertedObject))) 
       observer.on(.Completed) 

      case .Progress(let progress): 
       observer.on(.Next(<T>.Progress(progress))) 
       break 
      } 

      return NopDisposable.instance 
     } 
} 

看來上面的定義是錯誤的,因爲這不能被編譯:Cannot explicitly specialize a generic function

.flatMapLatest({ _ in 
    .rx_request(Router.Pipeline) 
}) 
.flatMapLatest({ result -> Observable<<ResponsePipeline>> in 
    .rx_convert<ResponsePipeline>(result) 
    // Cannot explicitly specialize a generic function 
}) 

我在做什麼錯在這裏?

回答

2
.flatMapLatest({ result -> Observable<<ResponsePipeline>> in 
    return .rx_convert(result) 
}) 

因爲傳遞給flatMapLatest關閉已經輸入到返回Observable<<ResponsePipeline>>,編譯器可以推斷類型rx_convert<AnyObject> -> Observable<<ResponsePipeline>>這樣你就可以從掉話<ResponsePipeline>

+0

謝謝你解釋! –

+0

@AndreiPopa你應該接受他的答案作爲正確的答案,點擊綠色的選中標記。 – solidcell