You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 01:05:45