PassthroughSubject中从不存在什么?

时间:2019-06-14 15:51:56

标签: swiftui combine

要使SwiftUI中的某个类符合BindableObject,它必须有一个Publisher,通常是didChange,到目前为止我在所有的SwiftUI文档和视频中都使用了Publisher。 ,是PassthroughSubject

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

2 个答案:

答案 0 :(得分:1)

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

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

对此类型的唯一要求是遵守Error

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

答案 1 :(得分:1)

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

Never被定义为没有大小写的枚举。这意味着它永远无法被构造。听起来没用。但是,确保功能按预期运行非常有用。

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

func fatalError() {}

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

永远不要在PassthroughSubject

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

PassthroughSubject<TestObject, Never>()

您是说这个主题永远不会因错误而失败。因此,在我们的代码中,我们无法调用以下内容,因为我们无法构造Never类型以传递给.failure

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

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

注意:

仍然可以使用以下命令终止流:

subject.send(completion: .finished)