如何使用 RxSwift 将一个错误映射到另一个错误

Yuc*_*ong 5 swift rx-swift

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

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

enum InternalError: Error {
   case fooError
   case barError
}

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

enum ServiceError: Error {
    case fatalError(message: String)
    case warning(message: String)
}
Run Code Online (Sandbox Code Playgroud)

我希望我们可以这样做,请注意以下内容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.")
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

是否可以?或者总体来说这是一个坏主意?

Tim*_*nin 2

您在问题中描述的内容不可能通过返回错误来完成,因为函数的返回类型是Observable<MyData>. 有两种解决方案:

您可以定义一个enum Result<T>with.success(T).error(Swift.Error)returnObservable<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.")
                        )
                    )
            }
        }
Run Code Online (Sandbox Code Playgroud)

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