BindableObject与ObservableObject的区别及适用场景咨询
BindableObject vs ObservableObject:区别与适用场景解析
嘿,这俩的区别其实核心就是「旧API」和「新替代API」的关系,给你唠明白:
核心区别
首先得明确:BindableObject是SwiftUI刚推出时(iOS 13/macOS 10.15初始版本)的状态管理API,后来苹果用ObservableObject+@Published把它彻底替代了,而且BindableObject现在已经被标记为废弃(Deprecated)了。
具体实现上的差异:
- BindableObject:必须手动声明
didChange这个PassthroughSubject,并且在属性变化时主动调用didChange.send()来通知UI更新。比如:class CounterBindable: BindableObject { let didChange = PassthroughSubject<Void, Never>() var count = 0 { didSet { // 手动发送变更通知 didChange.send() } } } - ObservableObject:借助Combine框架的
@Published属性包装器,自动帮你处理变更通知——属性只要被@Published标记,它的变化会自动触发UI更新,完全不用手动写发送逻辑。比如:class CounterObservable: ObservableObject { // 自动处理变更通知 @Published var count = 0 }
适用场景选择
只能用BindableObject的情况:
如果你维护的是非常早期的SwiftUI项目(基于iOS 13最初版开发,且无法升级到后续版本),那你可能还得和BindableObject打交道——但这种情况现在已经很少见了。优先用ObservableObject的情况:
- 所有新开发的SwiftUI项目,直接选ObservableObject就对了,它是苹果官方推荐的标准方案,代码更简洁,手动操作更少,出错概率更低。
- 哪怕你需要精细控制UI更新时机(比如不想每次属性变化都通知,而是攒一波再更),ObservableObject也能满足:你可以直接调用
objectWillChange.send()手动触发更新,完全没必要退回到旧的BindableObject。
简单说,现在除了维护古董项目,根本没理由用BindableObject啦~
内容的提问来源于stack exchange,提问作者Ian Warburton
相关产品推荐
相关产品推荐

