2016-03-29 7 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