首页 文章

如何使用RxSwift将一个错误映射到不同的错误

提问于
浏览
3

是否可以使用RxSwift映射错误类型?

例如,我有一个这样的辅助函数:

enum InternalError: Error {
   case fooError
   case barError
}

private func helper() -> Observable<MyData> {
    // ... 
}

enum ServiceError: Error {
    case fatalError(message: String)
    case warning(message: String)
}

我希望我们可以这样做,注意以下 mapError 不存在:

func getData() -> Observable<MyData> {
    helper().mapError({ error: InternalError -> ServiceError
        switch error {
            case .fooError: 
                return ServiceError.fatalError(message: "This is bad.")
            case .barError:
                return ServiceError.warning(message: "Be careful.")
        }
    })
}

可能吗?或者一般来说这是个坏主意吗?

1 回答

  • 1

    由于函数的返回类型是 Observable<MyData> ,因此您在问题中描述的问题无法通过 returning 错误执行 . 有两种解决方案:

    您可以使用 .success(T).error(Swift.Error) 定义 enum Result<T> 并返回 Observable<Result<MyData>> ,您可以按如下方式处理错误:

    helper().catchError{ error in
                guard let error = error as? InternalError else { throw UnknownError() }
                switch error {
                    case .fooError:
                        return Observable.just(
                            Result.error(
                                ServiceError.fatalError(message: "This is bad.")
                            )
                        )
                    case .barError:
                        return Observable.just(
                            Result.error(
                                ServiceError.warning(message: "Be careful.")
                            )
                        )
                }
            }
    

    或者你可以简单地通过用 throw 代替 return Observable... 来重新抛出,我个人认为这比 Result<T> 开销更好 .

相关问题