ObservableObject 中的 @Published 和普通 AnyPublisher 属性有什么区别

Mic*_*bro 2 swiftui combine

我考虑有什么区别

@Published var isLoggedIn: Bool = false 

var isLoggedIn: AnyPublisher<Bool, Never> 
Run Code Online (Sandbox Code Playgroud)

我知道在第一种情况下,我可以直接在 SwiftUI View 中使用它,即使用 $ 符号创建绑定,然后例如使用if $isLoggedIn.animation()

但我怎样才能实现同样的目标,AnyPublisher<Bool, Never>似乎我需要在某个地方调用allocatesinkstore()。为了让它发挥作用。因此,在 SwiftUI 中从它创建绑定似乎是不可能的if $isLoggedIn.animation

@Published 的限制是我无法进行自定义观察。例如 UserDefaults,我可以通过 UserDefaults.publisher 中的 AnyPublisher 来完成。

现在看来我需要两者都拥有并进行AnyPublisher更新@Published var

但我认为 @Published 是在常规 AnyPublisher 之下的属性包装器,那么为什么我不能直接从 AnyPublisher 在 SwiftUI 视图中进行绑定?

don*_*als 7

联合体@Published是一个由属性包装器包装的发布者。这为它提供了$SwiftUI 工作所依赖的前缀属性和其他功能。

财产也根本@Published不像财产。总是有一种故障类型,也可能有其他故障情况。AnyPublisher@PublishedNeverAnyPublisher

@Published具有状态感/当前值,但 的情况并非如此AnyPublisher。ACurrentValueSubject会最接近,但这不起作用,因为@Published可以用作绑定,而CurrentValueSubject. 一个重要的区别是 SwiftUI 可以@Published直接为属性分配新值(isLoggedIn = true将在此处触发更改)。

要在 SwiftUI 中与发布商合作,您需要将其值分配给专用@Published属性,如您在原始问题中提到的那样。

  • 您似乎将 SwiftUI 与 Combine 混合在一起。`@Published` 不是 SwiftUI 特定的属性包装器,它甚至不是框架的一部分。 (3认同)