要使SwiftUI
中的某个类符合BindableObject
,它必须有一个Publisher,通常是didChange
,到目前为止我在所有的SwiftUI文档和视频中都使用了Publisher。 ,是PassthroughSubject
。
例如,如果您有一个名为TestObject
的类,则didChange
可能等于PassthroughSubject<TestObject, Never>()
。我知道第一种类型是PassthroughSubject
传递的数据类型,但是Never
是什么?它的目的是什么?在第二种类型不是Never
的情况下是否存在?
答案 0 :(得分:1)
PassthroughSubject
提供的第二种类型是发生故障时使用的类型。
final class PassthroughSubject<Output, Failure> where Failure : Error
对此类型的唯一要求是遵守Error
。
当获取数据的方式会产生错误(例如网络错误)时,可以使用错误类型。
答案 1 :(得分:1)
接受的答案未说明Never
是什么,以及为什么我们可以将其与PassthroughSubject
一起使用。
Never
被定义为没有大小写的枚举。这意味着它永远无法被构造。听起来没用。但是,确保功能按预期运行非常有用。
例如fatalError
。 fatalError
将永远不会返回,因为它会使应用程序崩溃。因此,您可能会想将其声明为:
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)