swift 将Just与flatMap一起使用会产生故障不匹配,合并

j5fpnvbx  于 2个月前  发布在  Swift
关注(0)|答案(4)|浏览(14)

我有这样的代码

func request(request: URLRequest) -> AnyPublisher<Data, Error> {
    return Just(request)
        .flatMap { request in
            RequestManager.request(request) // returns AnyPublisher<Data, Error>
    }
    .eraseToAnyPublisher()
}

字符串
我得到了编译错误:
示例方法flatMap(maxPublishers:_:)要求类型Just.Failure(aka Never)和Error是等效的
很明显,因为JustNever作为Failure,而.flatMap需要Error作为Failure,所以Never!= Error
我看到两种方法:

  • 使用 right Publisher,而不是Just,但我没有找到合适的候选人。
  • 使用一些运算符,如.mapError.mapError { $0 as Error },但我不确定这是个好主意。

有什么办法吗?

更新:

更有意义的是

.setFailureType(to: Error.self)


.mapError { $0 as Error }

igsr9ssn

igsr9ssn1#

有一个特殊的操作符setFailureType(to:)。你可以覆盖失败类型为任何你需要的错误类型。

func request(request: URLRequest) -> AnyPublisher<Data, Error> {
    return Just(request)
        .setFailureType(to: Error.self)
        .flatMap { request in
            RequestManager.request(request) // returns AnyPublisher<Data, Error>
    }
    .eraseToAnyPublisher()
}

字符串
https://developer.apple.com/documentation/combine/just/3343941-setfailuretype

eit6fx6z

eit6fx6z2#

如果你在Just输出上调用.mapError(),它将改变类型以包括Error,但是这个闭包永远不会被调用(所以我不担心)-这是我会做的,除非有人有更好的主意。
通常情况下,flatMap上的Self.Error == P.Error是有意义的,因为你不能忽略来自Self的错误。但是,当Self.ErrorNever时,你可以忽略它们并产生自己的错误。

ssm49v7z

ssm49v7z3#

虽然公认的答案肯定有效,但它相当冗长。我偶然发现了一种使用Result<Success,Failure).publisher的替代语法,它更简洁一些:

Result.Publisher(.success(request))

字符串
(Note在这种情况下,我依赖于Swift来推断错误类型,但您可能需要显式声明它:Result<URLRequest, Error>.Publisher(.success(request))

zengzsys

zengzsys4#

在Swift 6中,应该使用(any Error).self,而不是Error.self

func request(request: URLRequest) -> AnyPublisher<Data, Error> {
    return Just(request)
        .setFailureType(to: (any Error).self)
        .flatMap { request in
            RequestManager.request(request)
        }
        .eraseToAnyPublisher()
}

字符串

相关问题