1

对于一个SwiftUI符合. BindableObject_didChangePassthroughSubject

例如,如果您有一个名为 的类TestObjectdidChange可能等于PassthroughSubject<TestObject, Never>()。我知道第一种类型是PassthroughSubject传递的数据类型,但是什么是Never?它的目的是什么,是否存在第二种类型不是的情况Never

4

2 回答 2

5

提供给的第二种类型PassthroughSubject是在发生故障时使用的类型。

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

这种类型的唯一要求是符合Error.

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

于 2019-06-14T16:01:01.407 回答
3

接受的答案没有说明什么Never是什么以及为什么我们可以将它与PassthroughSubject.

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

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

func fatalError() {}

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

从不进入 PassthroughSubject

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

PassthroughSubject<TestObject, Never>()

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

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

例如:假设我们有一个计时器,我们希望每 5 秒发布一次事件。我们可以使用 aPassthroughSubject每 5 秒向其订阅者发送消息。但是我们知道它不会失败,因此我们的任何消费者都清楚api他们不需要担心处理失败的情况,我们可以将PassthroughSubjectwith声明NeverError类型。

笔记:

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

subject.send(completion: .finished)

于 2019-10-14T09:33:54.820 回答