Swift中的架构模式:MVC、MVVM和VIPER(附示例)

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift中的架构模式:从混乱到有序

\n\n

每位iOS开发者迟早都会面临一个问题:“如何组织代码,才能让项目在半年后不会变成一团乱麻?”答案很简单——架构模式。在Swift中,与其他任何语言一样,架构的选择决定了应用维护、测试和扩展的便利性。今天,我们将分析三种最流行的方法:MVC、MVVM和VIPER。没有枯燥的理论——只有鲜活的代码和实用建议。

\n\n

如果你正在用Swift编写代码,但至今仍在使用“所有代码放在一个文件里”的方式——那么这篇文章就是为你准备的。开始吧!

\n\n

MVC(Model-View-Controller)——经典之作

\n\n

MVC是Apple在UIKit中内置的模式。看起来很简单:Model负责数据,View负责显示,Controller负责连接它们。但在实践中,iOS中的MVC常常演变成“Massive View Controller”——一个无所不知、无所不能、代码量高达数千行的控制器。

\n\n

然而,如果遵守纪律,MVC也能很好地工作。下面是一个显示用户列表的简单应用示例。

\n\n
// Model\nstruct User {\n    let name: String\n    let email: String\n}\n\n// View(非UI代码,而是用于更新的协议)\nprotocol UserListView: AnyObject {\n    func showUsers(_ users: [User])\n    func showError(_ error: Error)\n}\n\n// Controller\nclass UserListViewController: UIViewController, UserListView {\n    \n    @IBOutlet weak var tableView: UITableView!\n    private var users: [User] = []\n    private let dataService = DataService()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        tableView.dataSource = self\n        loadUsers()\n    }\n    \n    func loadUsers() {\n        dataService.fetchUsers { [weak self] result in\n            switch result {\n            case .success(let users):\n                self?.showUsers(users)\n            case .failure(let error):\n                self?.showError(error)\n            }\n        }\n    }\n    \n    func showUsers(_ users: [User]) {\n        self.users = users\n        tableView.reloadData()\n    }\n    \n    func showError(_ error: Error) {\n        let alert = UIAlertController(title: "错误", message: error.localizedDescription, preferredStyle: .alert)\n        alert.addAction(UIAlertAction(title: "确定", style: .default))\n        present(alert, animated: true)\n    }\n}\n\nextension UserListViewController: UITableViewDataSource {\n    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\n        return users.count\n    }\n    \n    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n        let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath)\n        let user = users[indexPath.row]\n        cell.textLabel?.text = user.name\n        cell.detailTextLabel?.text = user.email\n        return cell\n    }\n}
\n\n

MVC的优点:

\n
    \n
  • 简单易懂——每位新开发者都能快速上手。
  • \n
  • Apple原生支持——无需引入第三方库。
  • \n
  • 适合小型项目快速启动。
  • \n
\n\n

MVC的缺点:

\n
    \n
  • 控制器变得“臃肿”,难以测试。
  • \n
  • 不同屏幕之间的逻辑难以复用。
  • \n
  • 随着项目增长,代码会变成意大利面条。
  • \n
\n\n

结论:MVC适用于简单应用或原型。如果你知道项目会增长——请考虑MVVM或VIPER。

\n\n

MVVM(Model-View-ViewModel)——现代标准

\n\n

MVVM解决了MVC的主要问题——减轻控制器的负担。所有业务逻辑和用于显示的数据准备都移到了ViewModel中。View(控制器)只需订阅变化。

博客

书籍推荐