当前位置: 首页 > news >正文

(3)SwiftUI 的状态之上:数据流与架构(MVVM in SwiftUI)

🏗️ SwiftUI 的状态之上:数据流与架构(MVVM in SwiftUI)

“在状态之上,组织思想;在数据之上,构建架构。”


一、从状态到架构:为什么需要 MVVM

在前两篇中,我们认识了 SwiftUI 的核心哲学:

  • 声明式 UI —— 描述“我想要什么”;
  • 状态驱动 —— “UI = f(State)”。

这些理念在小型页面中非常高效。
但当项目复杂起来,比如多页跳转、网络请求、权限控制时,
你会发现仅靠 @State@ObservedObject 还不够。

这时候,我们需要更高层次的组织方式 —— MVVM 架构


二、什么是 MVVM?

MVVM 是 Model-View-ViewModel 的缩写,是 SwiftUI 官方推荐的架构。

层级作用在 SwiftUI 中的体现
Model数据层(结构体/类)普通数据类型、网络返回结果
ViewModel状态管理层,业务逻辑ObservableObject + @Published
View视图层(UI)SwiftUI View 结构体

三、为什么 SwiftUI 天然适合 MVVM?

UIKit 时代,ViewController 又管 UI 又管逻辑,是“大杂烩”。
SwiftUI 把 UI 从控制器中完全剥离,让 View 成为纯函数式结构。

因此:

  • View 只负责展示;
  • ViewModel 负责状态和逻辑;
  • Model 负责数据。

三者职责分明、天然分层。


四、MVVM 结构图

         +----------------------+|       View           || SwiftUI 描述 UI      |+----------+-----------+|@ObservedObject|+----------v-----------+|     ViewModel        || 管理状态 + 业务逻辑   || ObservableObject      |+----------+-----------+|调用网络层|+----------v-----------+|       Model          || 数据结构 + 请求响应   |+----------------------+

五、从一个 To-Do App 看 MVVM 的落地

我们以一个简单的待办事项应用为例。

🧱 Model:任务数据结构

struct Task: Identifiable, Codable {let id = UUID()var title: Stringvar isDone: Bool = false
}

⚙️ ViewModel:任务逻辑与状态管理

class TaskViewModel: ObservableObject {@Published var tasks: [Task] = []func addTask(title: String) {guard !title.isEmpty else { return }tasks.append(Task(title: title))}func toggleDone(task: Task) {if let index = tasks.firstIndex(where: { $0.id == task.id }) {tasks[index].isDone.toggle()}}func removeTask(at offsets: IndexSet) {tasks.remove(atOffsets: offsets)}
}

🪟 View:声明式界面展示

struct TaskListView: View {@StateObject private var viewModel = TaskViewModel()@State private var newTask = ""var body: some View {NavigationView {VStack {List {ForEach(viewModel.tasks) { task inHStack {Image(systemName: task.isDone ? "checkmark.circle.fill" : "circle").onTapGesture { viewModel.toggleDone(task: task) }Text(task.title).strikethrough(task.isDone)}}.onDelete(perform: viewModel.removeTask)}HStack {TextField("New Task", text: $newTask)Button("Add") {viewModel.addTask(title: newTask)newTask = ""}}.padding()}.navigationTitle("My Tasks")}}
}

六、SwiftUI MVVM 的关键要点

概念SwiftUI 实现说明
数据绑定@ObservedObject@StateObjectView 与 ViewModel 双向绑定
自动刷新@Published状态更新时自动刷新 UI
单向数据流ViewModel → View数据从上而下传递
无副作用 UIView 只描述布局,不管理逻辑视图是“结果”,非“命令”

七、MVVM + SwiftUI 的典型组合

模块说明实现方式
View负责界面展示struct + body
ViewModel业务逻辑 + 状态ObservableObject
Model数据结构struct
网络层数据请求async/await + URLSession
存储层本地数据UserDefaults / CoreData
全局状态环境对象@EnvironmentObject

八、实际项目中的 MVVM 分层建议

当你项目越来越复杂,可以这样组织目录:

📁 ProjectName┣ 📂 Models┃ ┗ Task.swift┣ 📂 ViewModels┃ ┗ TaskViewModel.swift┣ 📂 Views┃ ┗ TaskListView.swift┣ 📂 Services┃ ┗ NetworkManager.swift┣ 📂 Resources┃ ┗ Assets.xcassets┗ ProjectNameApp.swift

九、再往上一步:MVVM + Combine + async/await

在大型项目中,ViewModel 还经常结合 Combine 框架或异步函数。

@MainActor
class NewsViewModel: ObservableObject {@Published var articles: [Article] = []func fetchNews() async {do {let url = URL(string: "https://newsapi.org/...")!let (data, _) = try await URLSession.shared.data(from: url)let decoded = try JSONDecoder().decode([Article].self, from: data)articles = decoded} catch {print("Error:", error)}}
}

SwiftUI 与 async/await 完美融合,
让“声明式 UI + 异步状态”成为一种自然写法。


十、结语:SwiftUI 架构的三重境界

1️⃣ 声明式 UI

“我描述界面,不命令界面。”

2️⃣ 状态驱动

“UI = f(State)。”

3️⃣ 架构思维(MVVM)

“状态有归属,逻辑有层次。”


当你理解这三层关系时,
SwiftUI 就不再只是语法糖,
而是一个完整、优雅、可扩展的 UI 哲学体系。

从命令到声明,从变量到状态,从函数到架构。
这就是 SwiftUI。

http://www.dtcms.com/a/453267.html

相关文章:

  • 郴州网站seo个人兴趣网站设计
  • wordpress企业站源码做qq群头像网站
  • Vue和React怎么选?全面比对
  • C++之再谈类与对象
  • 巫山做网站那家好企业网站的建立
  • 深度学习基础:从原理到实践——第一章感知机(中)
  • 企业网站策划怎么样揭阳模板网站建站
  • 计算机网络第四章(8)——网络层《ICMB网际控制协议》
  • 网络教育网站如何做营销推广做ppt必备网站
  • 移植到Linux,Avalonia初次尝试意外美好
  • asp网站管理系统源码免费申请163邮箱
  • 欧拉公式剖析
  • 冲刺校招 打卡 day02
  • 【精品资料鉴赏】312页WORD 详解发电企业数字化转型规划方案()
  • 进阶 C++ 学习总结与核心感悟
  • gRPC从0到1系列【24】
  • 无锡设计师网站又拍云wordpress全站cdn
  • LeetCode 刷题【106. 从中序与后序遍历序列构造二叉树】
  • 大模型的核心原理
  • 用友u8 erp和免费生产排程软件isuperaps通过sql实现数据集成示例
  • 车载诊断架构 --- 车载ECU故障类型详解(下)
  • 解读IEC 60502-2 2014
  • 引流网站建设c 转网站开发
  • 新建网站如何做关键词wordpress一句话插件
  • 通过git拉取前端项目
  • 建设诚信网站儒枫网网站建设
  • AI - 自然语言处理(NLP) - part 3 - 语言模型
  • 人工智能与数据领域700+职位数据集:支持就业市场分析、NLP训练与推荐系统开发的高质量研究资源
  • 律师手机网站模板北京市工程建设交易信息网站
  • 0基础学CV(4)|目标检测模型之yolov8训练自己的数据集