首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.sink的Publisher扩展

.sink的Publisher扩展
EN

Stack Overflow用户
提问于 2022-09-20 06:32:37
回答 2查看 63关注 0票数 0

我为Publisher做了一个扩展,以简化接收器,但是我的后端(不是由我创建的)搞砸了,而且我有一个不应该是错误的自定义错误,我想返回.success。

代码语言:javascript
运行
复制
extension Publisher {
    func sinkToResult(_ result: @escaping ((Result<Self.Output, Self.Failure>) -> Void)) -> AnyCancellable {
        return sink(receiveCompletion: { completion in
            switch completion {
            case .failure(let error):
                if let error = error as? ApiError, let globalError = error.globalErrors.first, globalError.code == 2233 {
                    //Here i want to send something like return(.success(true))
                }
                result(.failure(error))
            case .finished:
                break
            }
        }, 
        receiveValue: { output in
            result(.success(output))
        })
    }
}

您能帮我创建一个可以在这里返回的自定义Output.Self类型吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-20 09:00:11

我想你有几个选择:

代码语言:javascript
运行
复制
enum MyResult<T> {
  case noError
  case object(T)
}

然后将func签名更改为:func sinkToResult(_ result: @escaping ((Result<MyResult<Self.Output>, Self.Failure>) -> Void)) -> AnyCancellable

或者您可以包装Result并添加您的特定情况:

代码语言:javascript
运行
复制
enum MyResult<Success, Failure: Error> {
  case noError
  case result(Result<Success, Failure>)
}

并将签名更改为:func sinkToResult(_ result: @escaping ((MyResult<Self.Output, Self.Failure>) -> Void)) -> AnyCancellable

无论哪种方式,我认为在执行JSON解码时直接处理这个问题会更好。

票数 1
EN

Stack Overflow用户

发布于 2022-09-20 13:39:11

我想你需要的是tryCatch,然后你才能沉下去

代码语言:javascript
运行
复制
func tryCatch<P>(_ handler: @escaping (Self.Failure) throws -> P) -> Publishers.TryCatch<Self, P> where P : Publisher, Self.Output == P.Output

苹果文档说:

通过将上游发布服务器替换为另一个发布服务器或抛出新错误来处理来自上游发布服务器的错误。

您可以将其添加为管道中的最后一步:

代码语言:javascript
运行
复制
///...
.tryCatch { error in
    if let error = error as? ApiError, let globalError = error.globalErrors.first, globalError.code == 2233 {
        return Just(true)
    } else {
        throw error
    }
}

如果您希望此发布者根据具体情况(如true或空Array等)返回不同的内容,则很难使其具有通用性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73782442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档