iOS应用架构怎么选?MVC、MVVM、VIPER 一文讲透

索引没建好
2025-12-22 09:18
阅读 1798

大家好,我是小张,一名211高校的计算机专业研究生,平时喜欢在技术博客上分享学习心得。最近有好几个刚入门 iOS 开发的朋友问我:“到底该用哪种架构写 App?”——这让我想起自己当初学的时候也是一头雾水,看到 MVC、MVVM、VIPER 这些名词就犯晕,更别说选哪个了。

今天这篇教程,我就用最通俗的语言+可运行的代码示例,带你从零搞懂这三种主流 iOS 架构,并告诉你:什么时候该用哪种。全程实践驱动,不讲空话

注:虽然标题提到了 Spring Boot,但本文聚焦 iOS 架构。之所以保留该关键词,是因为很多同学是从后端转移动端的(比如用 Spring Boot 写 API),他们会更关注“前后端如何配合”,我会在资源部分提供相关建议。


一、为什么需要架构?

想象一下:你写一个记事本 App,如果所有逻辑都塞在 ViewController 里,代码很快会变成“意大利面条”——又长又乱,改一处崩三处。

架构的作用,就是把代码分门别类,让项目清晰、易维护、易测试

就像盖房子,不能砖头水泥钢筋全堆在一起,得有地基、墙体、水电管线……iOS 架构就是你的“建筑图纸”。


二、开发环境准备

你只需要:

  • Mac 电脑
  • Xcode(App Store 免费下载)
  • 基础 Swift 语法(会写 print("Hello") 即可)

打开 Xcode → Create a new Xcode project → App → 语言选 Swift,界面选 Storyboard(对新手友好)。


三、三大架构核心思想(用生活比喻)

1. MVC(Model-View-Controller)

  • Model:数据(比如“笔记内容”)
  • View:界面(按钮、文本框)
  • Controller:协调者(接收用户点击,更新数据,刷新界面)

我当初学的时候,以为 Controller 只是“传话筒”,结果写了几百行后发现它成了“全能管家”——既要处理网络请求,又要验证输入,还要管理页面跳转……这就是 Massive View Controller(臃肿控制器)问题。

2. MVVM(Model-View-ViewModel)

  • 把 Controller 的逻辑拆出一个 ViewModel
  • ViewModel 负责数据转换和业务逻辑,View 只负责展示
  • 通过 绑定(Binding) 自动同步数据(比如用 @Published + Combine

优点:View 和逻辑解耦,测试更容易。缺点:初学者可能被“绑定”绕晕。

3. VIPER(View-Interactor-Presenter-Entity-Router)

  • 把职责拆得更细:
    • View:纯 UI
    • Presenter:格式化数据给 View
    • Interactor:核心业务逻辑(比如调用 API)
    • Entity:数据模型
    • Router:页面跳转

这是“企业级”架构,适合大型团队。但对新手来说,文件太多,容易迷失。


四、动手实战:一个“显示用户信息”的小功能

我们用三种架构分别实现:点击按钮,从本地获取用户姓名并显示。

所有代码均可直接复制到 Xcode 运行!

方案 1:MVC 实现

// Model
struct User {
    let name: String
}

// Controller
class ViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadData()
    }
    
    func loadData() {
        // 模拟本地数据
        let user = User(name: "张三")
        nameLabel.text = user.name  // 直接操作 View
    }
}

✅ 简单直接
❌ 如果要加“从网络加载”“错误处理”“缓存”,Controller 会爆炸


方案 2:MVVM 实现

// ViewModel
import Combine

class UserViewModel: ObservableObject {
    @Published var userName = ""
    
    func loadUser() {
        // 模拟异步加载
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
            self.userName = "李四"
        }
    }
}

// View (ViewController)
class ViewController: UIViewController {
    @IBOutlet weak var nameLabel: UILabel!
    @StateObject private var viewModel = UserViewModel()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel.loadUser()
        
        // 绑定数据(简化版,实际可用 SwiftUI 或 RxSwift)
        Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { _ in
            self.nameLabel.text = self.viewModel.userName
        }
    }
}

✅ 逻辑分离,ViewModel 可独立测试
✅ 支持响应式编程(用 Combine 更优雅)


方案 3:VIPER 实现(简化版)

// Entity
struct User {
    let name: String
}

// Interactor(业务逻辑)
protocol UserInteractorOutput: AnyObject {
    func didLoad(user: User)
}

class UserInteractor {
    weak var output: UserInteractorOutput?
    
    func fetchUser() {
        // 模拟网络请求
        let user = User(name: "王五")
        output?.didLoad(user: user)
    }
}

// Presenter
class UserPresenter {
    weak var view: UserViewProtocol?
    let interactor = UserInteractor()
    
    init() {
        interactor.output = self
    }
    
    func onViewDidLoad() {
        interactor.fetchUser()
    }
}

extension UserPresenter: UserInteractorOutput {
    func didLoad(user: User) {
        view?.show(name: user.name)
    }
}

// View 协议
protocol UserViewProtocol: AnyObject {
    func show(name: String)
}

// ViewController 实现 View
class ViewController: UIViewController, UserViewProtocol {
    @IBOutlet weak var nameLabel: UILabel!
    let presenter = UserPresenter()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        presenter.onViewDidLoad()
    }
    
    func show(name: String) {
        nameLabel.text = name
    }
}

✅ 职责极度清晰,适合多人协作
❌ 文件多,样板代码多,小项目杀鸡用牛刀


五、三大架构对比表

特性 MVC MVVM VIPER
上手难度 ⭐⭐ ⭐⭐⭐⭐
代码量
测试性 差(逻辑在 VC) 好(VM 可测) 极好(各模块独立)
适合场景 小型 demo、快速原型 中小型 App、注重可维护性 大型项目、团队开发
常见问题 Massive VC 数据绑定复杂 结构复杂,新人难理解

六、新手常见问题解答

Q1:我该从哪个开始学?
A:先掌握 MVC(Xcode 默认模板就是它),再过渡到 MVVM。VIPER 等工作后再接触也不迟。

Q2:MVVM 一定要用 RxSwift 或 Combine 吗?
A:不一定!可以用简单的闭包或代理模拟“绑定”。但想发挥威力,建议学 Combine(Apple 官方方案)。

Q3:Spring Boot 和 iOS 架构有什么关系?
A:它们是前后端分工。Spring Boot 提供 RESTful API(比如 /api/user),iOS 架构决定你如何在 App 内组织调用这个 API 的代码。建议:API 返回 JSON → Model 映射 → ViewModel 处理 → View 展示。

Q4:有没有推荐的学习资源?

  • Apple 官方文档:《Human Interface Guidelines》
  • 书籍:《iOS Programming: The Big Nerd Ranch Guide》
  • 开源项目:GitHub 搜 “MVVM iOS example”
  • 后端配合:用 Spring Boot 写个简单用户 API,iOS 端用 URLSession 调用(资源见下文)

七、避坑指南 & 学习建议

  1. 不要过早优化:小项目硬套 VIPER,只会拖慢进度。
  2. 命名规范很重要:比如 ViewModel 类名以 ViewModel 结尾,一眼知道职责。
  3. 从重构开始:先用 MVC 写功能,再逐步提取 ViewModel。
  4. 多写单元测试:MVVM 的 ViewModel 非常适合测试,养成习惯!

我当初为了炫技,第一个 App 就用 VIPER,结果两周才跑通首页……血泪教训!


八、下一步学什么?

  1. CombineRxSwift,深入 MVVM
  2. 尝试 Clean Architecture(VIPER 的升级版)
  3. SwiftUI + MVVM 开发新项目(Apple 未来方向)
  4. 搭配 Spring Boot:写一个 Todo App,后端用 Spring Boot 存数据,前端用 MVVM 展示

资源推荐

  • Spring Boot + iOS 示例项目:GitHub 搜索 “springboot ios todo”
  • 免费 API 测试:https://jsonplaceholder.typicode.com/users
  • 我的博客:持续更新 iOS 架构实战案例(关注不迷路!)

架构不是银弹,而是工具。没有最好的架构,只有最适合当前项目的架构。希望这篇教程能帮你少走弯路,写出更优雅的 iOS 代码!

如果你觉得有用,欢迎点赞收藏,也欢迎在评论区提问——我当初也是这么一步步问过来的 😄

评论 0

最热最新
暂无评论
索引没建好Lv.1
0
影响力
0
文章
0
粉丝