PassthroughSubject 中的 Never 是什么?

What is Never in PassthroughSubject?

要使 SwiftUI 中的 class 符合 BindableObject,它必须有一个发布者,通常是 didChange,在所有 SwiftUI 文档和视频中我目前看到的,是一个PassthroughSubject.

例如,如果您有一个名为 TestObject 的 class,则 didChange 可能等于 PassthroughSubject<TestObject, Never>()。我理解第一种是PassthroughSubject传递的数据类型,但是Never是什么?它的用途是什么,有没有第二类不是Never的场景?

提供给PassthroughSubject的第二个类型是失败时使用的类型。

final class PassthroughSubject<Output, Failure> where Failure : Error

此类型的唯一要求是符合Error

当您获取数据的方式可能会产生错误(例如网络错误)时,您可以使用错误类型。

接受的答案没有说明 Never 是什么以及为什么我们可以将它与 PassthroughSubject 一起使用。

Never 被定义为没有大小写的枚举。这意味着它永远无法构建。听起来没用。然而,确保函数按预期运行非常有用。

例如fatalErrorfatalError 永远不会 return 因为它会使应用程序崩溃。因此,您可能想将其声明为:

func fatalError() {}

然而,这是不正确的。上面的函数实际上是 returning 一个空元组(就像上面在 swift 中声明的所有函数一样)。为了类型正确,我们想让编译器知道如果调用这个函数,它永远不会 return 到最初调用它的代码。因此我们可以使用 Never.

从不在 PassthroughSubject

有时我们希望Subjects永远不会发送错误。通过声明:

PassthroughSubject<TestObject, Never>()

你是说这个主题永远不会因错误而失败。所以在我们的代码中我们不能调用下面的,因为我们不能构造一个 Never 类型来传递给 .failure:

subject.send(completion: .failure(<Nothing to construct here>))

例如:假设我们有一个计时器,我们想每 5 秒发布一次事件。我们可以使用 PassthroughSubject 每 5 秒向其订阅者发送一次消息。但是我们知道它不会失败,所以为了让我们的 api 的任何消费者清楚他们不需要担心处理失败情况,我们可以用 Never 声明 PassthroughSubject作为 Error 类型。

注:

仍然可以使用以下方法终止流:

subject.send(completion: .finished)