Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • Model、View、ViewModel 的角色与职责

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

img.png

边界控制原则

  1. View 禁止直接操作 Model
  2. ViewModel 不包含 UI 相关代码(如颜色、字体等)
  3. Model 保持平台无关性(可独立于 SwiftUI 存在)

关键设计模式:通过 ViewModel 实现 "View 不知道 Model 存在" 的松耦合架构

Last Updated:: 6/17/25, 10:13 AM