gpt4 book ai didi

swift - 当发布者失败类型不等效时如何使用 CombineLates?

转载 作者:行者123 更新时间:2023-12-01 23:36:38 25 4
gpt4 key购买 nike

我有两个函数返回AnyPublisher,但失败类型不同:NeverError。在 CombineLates 中使用这些函数时,编译会失败并出现错误:Generic struct 'CombineLatest' requires the types 'Error' and 'Never' be equivalent

永不失效的函数:

func foo() -> AnyPublisher<Int, Never> {
Result<Int, Never>
.success(1).publisher
.eraseToAnyPublisher()
}

有时失败的功能:

func boo() -> AnyPublisher<Int, Error> {
Result<Int, Error>
.failure(NSError(domain: "d", code: -1))
.publisher.eraseToAnyPublisher()
}

foo & boo 函数用法:

Publishers.CombineLatest(foo(), boo())

产生错误:

Generic struct 'CombineLatest' requires the types 'Error' and 'Never' be equivalent

发布者失败类型不等时如何使用CombineLates?

最佳答案

每当您需要在 Combine 中匹配失败类型时,对于 Never 失败类型,例如 Just 发布者,您将使用 setFailureType(to:) :

let p: AnyPublisher<Int, Never> = ...

let p1 = p.setFailureType(to: Error.self)
.eraseToAnyPublisher() // AnyPublisher<Int, Error>

对于非Never 失败,您需要使用.mapError:

let p2 = p1.mapError { CustomError(wrapping: $0) }
.eraseToAnyPublisher() // AnyPublisher<Int, CustomError>

所以,在你的情况下,如果你想改变 foo 的返回值,你会这样做:

func foo() -> AnyPublisher<Int, Error> {
Result<Int, Never>
.success(1).publisher
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
}

如果你不想改变foo,但仍然使用with with bar,你可以这样做:

Publishers.CombineLatest(foo().setFailureType(to: Error.self), boo())
.map { (f, b) in
// f and b are Ints, as emitted by foo and bar, respectively
}

关于swift - 当发布者失败类型不等效时如何使用 CombineLates?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65503215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com