CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
SwiftUI 开发入门/课时/状态管理
RawBlame
课时目录12 节

SwiftUI 开发入门

  1. 01Swift 与 SwiftUI 概览
  2. 02基础语法与类型
  3. 03控制流
  4. 04函数与闭包
  5. 05结构体、类与协议
  6. 06SwiftUI 视图
  7. 07状态管理
  8. 08导航与生命周期
  9. 09并发与 async/await
  10. 10数据持久化
  11. 11MVVM 与架构
  12. 12综合练习

状态管理

@State、@Binding、@ObservedObject。

35 分钟

状态管理

SwiftUI 是数据驱动 UI:状态变化自动触发视图重绘。对照 /roadmaps/swift-ui「状态管理」节点,属性包装器是 SwiftUI 最核心的概念。

学习目标

  • 掌握 @State、@Binding 的适用场景
  • 使用 @StateObject、@ObservedObject 管理 ViewModel
  • 理解 @EnvironmentObject 跨层级共享
  • 区分 @Published 与手动触发更新

核心概念

@State 与 @Binding

struct CounterView: View {
    @State private var count = 0

    var body: some View {
        VStack(spacing: 20) {
            Text("计数: \(count)")
                .font(.largeTitle)
            StepperView(count: $count)
            Button("重置") { count = 0 }
        }
        .padding()
    }
}

struct StepperView: View {
    @Binding var count: Int

    var body: some View {
        HStack {
            Button("-") { count -= 1 }
            Text("\(count)").frame(width: 40)
            Button("+") { count += 1 }
        }
    }
}

@State 由视图拥有数据;$count 产生 Binding 传给子视图。子视图不拥有数据,只读写绑定。

ObservableObject 与 ViewModel

@MainActor
final class LessonListViewModel: ObservableObject {
    @Published var lessons: [Lesson] = []
    @Published var searchText = ""

    var filteredLessons: [Lesson] {
        guard !searchText.isEmpty else { return lessons }
        return lessons.filter { $0.title.contains(searchText) }
    }

    func toggleComplete(id: Int) {
        guard let i = lessons.firstIndex(where: { $0.id == id }) else { return }
        lessons[i].completed.toggle()
    }

    func loadMockData() {
        lessons = [
            Lesson(id: 1, title: "状态管理", completed: false),
            Lesson(id: 2, title: "导航", completed: true),
        ]
    }
}

struct LessonSearchView: View {
    @StateObject private var viewModel = LessonListViewModel()

    var body: some View {
        VStack {
            TextField("搜索课时", text: $viewModel.searchText)
                .textFieldStyle(.roundedBorder)
                .padding(.horizontal)

            List(viewModel.filteredLessons) { lesson in
                HStack {
                    Text(lesson.title)
                    Spacer()
                    Image(systemName: lesson.completed ? "checkmark.circle.fill" : "circle")
                        .onTapGesture { viewModel.toggleComplete(id: lesson.id) }
                }
            }
        }
        .onAppear { viewModel.loadMockData() }
    }
}

@StateObject 创建并持有 ViewModel 生命周期;@ObservedObject 接收外部传入。@Published 变更自动通知视图刷新。

状态层级速查

包装器所有权典型用途
@State视图私有开关、计数、临时输入
@Binding引用父级子组件双向绑定
@StateObject视图创建持有ViewModel 初始化
@ObservedObject外部注入父视图传入 ViewModel
@EnvironmentObject环境注入全局 Theme、Auth

与 React/SwiftUI 对照

SwiftUIReact Hooks说明
@StateuseState组件本地状态
@Binding受控组件 value + onChange父控子
@StateObjectuseState(() => new Store())稳定引用
@ObservedObjectprops 传入 store外部 store
@EnvironmentObjectuseContext跨层共享
@PublishedsetState / Zustand触发重渲染
$variable回调 + value 合成 Binding语法糖

React 的 lifting state up 对应 Swift 将 @State 提升到父 View 并通过 @Binding 下发。

练习

  • 实现 Todo 项:@State 管理列表,@Binding 传给行组件
  • 创建 LessonListViewModel,用 @StateObject 注入视图
  • 用 @EnvironmentObject 注入 AppSettings(如 darkMode)
  • 对照 react-props-state 画状态流向图

小结

@State 本地、@Binding 双向、ObservableObject 业务状态。 下一课导航与生命周期。见 swift-ui-essentials。

加载本节练习…
← 上一课SwiftUI 视图下一课 →导航与生命周期