33

我有这样的代码

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(又名 Never)和 Error 类型是等价的

很清楚,因为Justhas NeverasFailure.flatMaprequires Erroras Failure,所以Never!=Error

我看到两种方法:

  • 使用正确的Publisher,而不是Just,但我没有找到合适的人选。

  • 使用像.mapError,之类的运算符.mapError { $0 as Error },但我不确定这是个好主意。

任何想法如何处理它?

更新:

使用起来更有意义

.setFailureType(to: Error.self)

或者

.mapError { $0 as Error }
4

3 回答 3

53

有专门的运算符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

于 2019-08-21T18:29:14.317 回答
3

如果您调用.mapError()Just 输出,它会将类型更改为 include Error,但永远不会调用该闭包(所以我不会担心)——除非有人有更好的主意,否则我会这样做。

通常,Self.Error == P.Erroron flatMap 是有意义的,因为您不能忽略来自 Self 的错误。但是,when Self.Erroris Never,您可以忽略它们并产生您自己的错误。

于 2019-08-19T00:46:20.700 回答
2

虽然公认的答案确实有效,但它非常冗长。我偶然发现了另一种使用Result<Success,Failure).publisher的语法,它更简洁一些:

Result.Publisher(.success(request))

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

于 2020-09-22T18:06:51.437 回答