使用 RxSwift 的通用转换方法的问题
Issue with generic conversion method using RxSwift
我调用了这个结果数据类型,它包含一个类型和一个进度
public enum <T> {
case Success(T)
case Progress(CGFloat)
}
class func rx_request(router: Router) -> Observable<<AnyObject>>
这个AnyObject
需要转换成一个Mappable
结构(ObjectMapper),所以因为我有几个这样的Mappable结构,我想实现这样的东西,一个通用的映射,我可以使用:
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
的闭包已经被类型化为 return 和 Observable<<ResponsePipeline>>
,编译器可以推断 rx_convert
的类型为 <AnyObject> -> Observable<<ResponsePipeline>>
所以您可以挂断电话 <ResponsePipeline>
。
我调用了这个结果数据类型,它包含一个类型和一个进度
public enum <T> {
case Success(T)
case Progress(CGFloat)
}
class func rx_request(router: Router) -> Observable<<AnyObject>>
这个AnyObject
需要转换成一个Mappable
结构(ObjectMapper),所以因为我有几个这样的Mappable结构,我想实现这样的东西,一个通用的映射,我可以使用:
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
的闭包已经被类型化为 return 和 Observable<<ResponsePipeline>>
,编译器可以推断 rx_convert
的类型为 <AnyObject> -> Observable<<ResponsePipeline>>
所以您可以挂断电话 <ResponsePipeline>
。