Appearance
iOS 中常见的架构演进
1. UIKit 时代主流:MVC(Model-View-Controller)
特点:View 和 Controller 粘得死死的,导致后来演变出“Massive View Controller(巨型控制器)”的恶名。
示例:
Model:任务对象TodoView:Storyboard 里的控件(UILabel,UITableView)Controller:ViewController.swift中处理事件响应、数据更新、界面刷新
2. 现代推荐(尤其是 SwiftUI):MVVM(Model-View-ViewModel)
- 结构更清晰,最适合 SwiftUI 的声明式风格
- 三层职责:
| 层 | 说明 |
|---|---|
| Model | 业务数据结构,和后端 API 对接 |
| View | SwiftUI 中的 .body(Text(), List()) |
| ViewModel | 数据与视图绑定桥梁,用 @Published, @ObservedObject 等属性驱动 UI 自动更新 |
🧠 SwiftUI 本身自带「数据驱动视图」的能力,所以 MVVM + SwiftUI 是目前苹果亲儿子的最优解。
3. 更进阶(了解即可):VIPER / Clean Architecture
- 职责更细分:View、Interactor、Presenter、Entity、Router
- 用于大型项目,初学者不建议一开始就整这个,容易懵。
🧠 SwiftUI 下 MVVM 简单例子(Todo App)
swift
// Model
struct Todo: Identifiable, Codable {
let id: Int
var title: String
var isDone: Bool
}
// ViewModel
class TodoViewModel: ObservableObject {
@Published var todos: [Todo] = []
func addTodo(title: String) {
let new = Todo(id: Int.random(in: 1000...9999), title: title, isDone: false)
todos.append(new)
}
func toggleDone(todo: Todo) {
if let index = todos.firstIndex(where: { $0.id == todo.id }) {
todos[index].isDone.toggle()
}
}
}
// View
struct TodoListView: View {
@StateObject var vm = TodoViewModel()
var body: some View {
List {
ForEach(vm.todos) { todo in
HStack {
Text(todo.title)
Spacer()
Image(systemName: todo.isDone ? "checkmark.circle.fill" : "circle")
.onTapGesture {
vm.toggleDone(todo: todo)
}
}
}
}
}
}- MVC 是祖传老配方,写着写着 Controller 就成了猪肝
- MVVM + SwiftUI 是苹果亲儿子级搭配,数据自动驱动 UI,写起来像冥想一样丝滑
- 架构选得好,代码如画;结构乱了,维护就像拆炸弹