SwiftUI中@State与@Published的使用场景对比
SwiftUI中@State与ViewModel@Published的选择场景
问题描述
在使用变量更新UI的场景下,结合MVVM架构的学习背景,想了解:何时、为何要在View中使用@State,而非在ViewModel中使用@Published?大致了解两者的区别,但不清楚在两者都能实现相同功能时该如何选择。以下是两个实现相同功能的示例:
@State实现示例
struct MyView: View { @State var backgroundIsRed = false var body: some View { ZStack { if backgroundIsRed { Color.red } else { Color.green } } .onTapGesture { backgroundIsRed.toggle() } } }
@Published+ViewModel实现示例
class ViewModel: ObservableObject { @Published var backgroundIsRed = false } struct MyView: View { @StateObject var viewModel = ViewModel() var body: some View { ZStack { if viewModel.backgroundIsRed { Color.red } else { Color.green } } .onTapGesture { viewModel.backgroundIsRed.toggle() } } }
选择原则
优先使用@State的场景
- 状态仅属于当前View的内部私有UI状态,不需要和其他View、组件共享
- 状态逻辑极其简单,只是用于本地UI交互(比如示例中的背景色切换、按钮选中状态、文本框临时输入内容等)
- 不需要关联业务逻辑、持久化或跨组件传递,完全是View自身的交互需求
选择ViewModel+@Published的场景
- 状态需要在多个View之间共享(比如父子View传递状态、TabView的不同页面共享状态)
- 状态和业务逻辑绑定(比如需要调用网络接口、操作数据库后更新UI状态)
- 状态需要被持久化(比如保存到UserDefaults、CoreData)
- 需要对状态相关逻辑做单元测试:ViewModel是类,可以单独提取出来测试,而@State的逻辑无法脱离View单独测试
针对示例的分析
你给出的背景色切换示例,用@State实现更合适。因为这个状态完全是MyView自身的私有UI状态,没有外部依赖、不需要共享或关联业务逻辑,用@State的代码更简洁,也符合SwiftUI对轻量内部状态的设计初衷。
内容的提问来源于stack exchange,提问作者Stoic
相关产品推荐
相关产品推荐

