我遵循我的Rx代码中的模式,通常我有一个Observable触发器,我用flatMap为网络请求创建另一个Observable。简化示例:
enum ViewModelError: Error {
case bang
}
enum DataTaskError: Error {
case bang
}
func viewModel(trigger: Observable<Void>,
dataTask: Observable<Result<SomeType, DataTaskError>>) -> Observable<Result<AnotherType, ViewModelError>> {
let apiResponse = trigger
.flatMap { dataTask }
}
我遇到了类似的合并问题。我可以将Result用作输出类型,而将Never用作Failure类型,但这感觉是对API的滥用。
func viewModel(trigger: AnyPublisher<Void, Never>,
dataTask: AnyPublisher<SomeType, DataTaskError>) -> AnyPublisher<AnotherType, ViewModelError> {
let apiResponse = trigger
.flatMap { dataTask }
}
我收到编译错误:
Instance method 'flatMap(maxPublishers:_:)' requires the types 'Never' and 'DataTaskError' be equivalent
我可以使用mapError并将这两个错误都转换为Error,但是我需要一个DataTaskError才能创建我的ViewModelError。
这似乎不应该那么困难,并且似乎是一个相当普遍的用例。我可能只是误解了一些基本原理,朝着正确方向的观点将不胜感激。
[如果您的发布者的失败类型为Never,则可以使用setFailureType(to:)
匹配其他发布者的失败类型。请注意,根据文档,仅当故障类型为“从不”时,才可以使用此方法。当您具有实际故障类型时,可以使用setFailureType(to:)
转换错误。因此,您可以执行以下操作:
mapError(_:)