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
被定义为没有大小写的枚举。这意味着它永远无法构建。听起来没用。然而,确保函数按预期运行非常有用。
例如fatalError
。 fatalError
永远不会 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)
要使 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
被定义为没有大小写的枚举。这意味着它永远无法构建。听起来没用。然而,确保函数按预期运行非常有用。
例如fatalError
。 fatalError
永远不会 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)