Model、View、ViewModel 的角色与职责
Model 层:数据与业务逻辑的核心
核心职责
- 数据表示:定义应用程序的数据结构(如
TodoItem的title和isCompleted属性) - 业务规则:封装数据验证、计算逻辑(如任务截止日期的有效性检查)
- 持久化:与数据库/网络层交互(通过
Codable协议或 Core Data 实现)
SwiftUI 中的实现特点
- 优先使用值类型(
struct)保证不可变性和线程安全 - 示例代码:
struct TodoItem: Identifiable, Codable { let id: UUID var title: String var isCompleted: Bool }
View 层:声明式用户界面
核心职责
- UI 呈现:通过 SwiftUI 的声明式语法描述界面布局
- 用户交互:处理点击、滑动等手势事件(通过
Button或onTapGesture) - 数据展示:将 Model 数据可视化(如
List显示 Todo 项)
关键原则
- 保持无状态:依赖
@Binding或@ObservedObject获取动态数据 - 示例代码:
struct TodoListView: View { @ObservedObject var viewModel: TodoListViewModel var body: some View { List($viewModel.items) { $item in Toggle(item.title, isOn: $item.isCompleted) } } }
ViewModel 层:业务逻辑与状态管理
核心职责
- 状态管理:通过
@Published属性包装器维护可变状态 - 数据转换:将 Model 数据转换为 View 可用的格式(如日期格式化)
- 事件处理:响应 View 层事件并触发业务逻辑(如网络请求)
SwiftUI 特殊实现
- 继承
ObservableObject协议实现数据绑定 - 使用 Combine 框架处理异步操作
- 示例代码:
class TodoListViewModel: ObservableObject { @Published var items: [TodoItem] = [] func addItem(title: String) { let newItem = TodoItem(id: UUID(), title: title, isCompleted: false) items.append(newItem) } }
三层协作关系
graph LR
A[View] -->|订阅| B[ViewModel]
B -->|读写| C[Model]
A -->|用户操作| B
C -->|数据变更通知| B

边界控制原则
- View 禁止直接操作 Model
- ViewModel 不包含 UI 相关代码(如颜色、字体等)
- Model 保持平台无关性(可独立于 SwiftUI 存在)
关键设计模式:通过 ViewModel 实现 "View 不知道 Model 存在" 的松耦合架构
