Skip to content

iOS 中常见的架构演进

1. UIKit 时代主流:MVC(Model-View-Controller)

  • 特点:View 和 Controller 粘得死死的,导致后来演变出“Massive View Controller(巨型控制器)”的恶名。

  • 示例:

    • Model:任务对象 Todo
    • View:Storyboard 里的控件(UILabel, UITableView
    • ControllerViewController.swift 中处理事件响应、数据更新、界面刷新

2. 现代推荐(尤其是 SwiftUI):MVVM(Model-View-ViewModel)

  • 结构更清晰,最适合 SwiftUI 的声明式风格
  • 三层职责:
说明
Model业务数据结构,和后端 API 对接
ViewSwiftUI 中的 .bodyText(), 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,写起来像冥想一样丝滑
  • 架构选得好,代码如画;结构乱了,维护就像拆炸弹