我有一个名为🍒的结果数据类型,它包装一个类型和一个进程
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
})
我在这里做错什么了?
最佳答案
.flatMapLatest({ result -> Observable<🍒<ResponsePipeline>> in
return 🐯.rx_convert(result)
})
因为传递给
flatMapLatest
的闭包已被键入以返回Observable<🍒<ResponsePipeline>>
,所以编译器可以推断rx_convert
的类型为🍒<AnyObject> -> Observable<🍒<ResponsePipeline>>
,以便您可以从调用中删除<ResponsePipeline>
。