首页 > 解决方案 > ObservableObject 中的@Published 和普通 AnyPublisher 属性有什么区别

问题描述

我考虑有什么区别

@Published var isLoggedIn: Bool = false 

var isLoggedIn: AnyPublisher<Bool, Never> 

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

但是我怎样才能达到同样的效果AnyPublisher<Bool, Never>,似乎我需要在某处调用assignsinkstore()。让它发挥作用。所以在 SwiftUI 中创建绑定似乎是不可能的if $isLoggedIn.animation

@Published 的限制是我不能在那里进行自定义观察。例如,我可以通过 UserDefaults.publisher 中的 AnyPublisher 执行 UserDefaults。

现在看来我需要同时拥有并进行AnyPublisher更新@Published var

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

标签: swiftuicombine

解决方案


Combine's@Published是一个由属性包装器包装的发布者。这为其$提供了 SwiftUI 所依赖的前缀属性和其他功能。

一个@Published属性也根本不像一个AnyPublisher@Published总是有Never作为它的故障类型,AnyPublisher可以有其他故障情况。

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

要在 SwiftUI 中与您的发布者合作,您需要将他们的值分配给@Published您在原始问题中提到的专用属性。


推荐阅读