企业级Swift:大型公司如何编写代码

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

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

开始课程

企业级Swift:当iOS开发进入大型企业层面

\n\n

您是否想过,一个由两名开发人员为初创公司编写的应用程序代码,与50名工程师在大型企业中编写的代码有何不同?差异是巨大的。企业级Swift不仅仅是使用Swift编写函数。它是一整套理念:可扩展性、可维护性、安全性和可预测性。

\n\n

在本文中,我们不会教授Swift的基础知识。我们将深入探究大型公司中Swift开发的幕后。您将了解领先工程师采用哪些架构决策,如何构建CI/CD,为什么依赖注入是必备项,以及代码审查如何成为成长工具而非官僚主义。让我们开始吧。

\n\n

架构:从MVC到模块化单体与微服务

\n\n

在初创公司中,经常使用MVC(模型-视图-控制器)——快速、简单、易懂。但当您拥有500多个屏幕、20个模块和30人的团队时,MVC就变成了“Massive View Controller”。企业级Swift开发需要更严格的纪律。

\n\n

整洁架构(Clean Architecture)与VIPER

\n\n

企业中最流行的模式是VIPER和Clean Swift。它们将职责划分为5个层次:

\n\n
    \n
  • View — 显示UI并传递用户操作。
  • \n
  • Interactor — 包含业务逻辑。
  • \n
  • Presenter — 准备用于显示的数据。
  • \n
  • Entity — 数据模型。
  • \n
  • Router — 管理导航。
  • \n
\n\n

一个基于VIPER的简单模块示例:

\n\n
// Protocol\nprotocol UserListInteractorInput: AnyObject {\n    func fetchUsers()\n}\n\n// Implementation\nfinal class UserListInteractor: UserListInteractorInput {\n    weak var presenter: UserListInteractorOutput?\n    private let networkService: NetworkServiceProtocol\n\n    init(networkService: NetworkServiceProtocol) {\n        self.networkService = networkService\n    }\n\n    func fetchUsers() {\n        networkService.getUsers { [weak self] result in\n            switch result {\n            case .success(let users):\n                self?.presenter?.didFetchUsers(users)\n            case .failure(let error):\n                self?.presenter?.didFailWithError(error)\n            }\n        }\n    }\n}\n
\n\n

每个模块都进行隔离测试。这对于可扩展的Swift项目至关重要。

\n\n

功能模块:拆分单体

\n\n

在大型公司中,应用程序被拆分为功能模块。每个模块都是一个独立的Swift Package或XCFramework。为什么这很酷?

\n\n
    \n
  • 并行开发:一个团队编写用户资料,另一个团队编写新闻,第三个团队编写支付。
  • \n
  • 错误隔离:聊天模块中的错误不会破坏地图模块。
  • \n
  • 可重用性:授权模块可以放入公司的另一个应用程序中。
  • \n
\n\n

项目结构示例:

\n\n
MyEnterpriseApp/\n├── Core/\n│   ├── Network\n│   ├── Storage\n│   └── UIComponents\n├── Features/\n│   ├── Profile\n│   ├── Feed\n│   ├── Messaging\n│   └── Payments\n└── App\n
\n\n

依赖注入:控制混乱

\n\n

当您拥有1000多个类时,手动创建依赖关系是通往地狱之路。在企业环境中,依赖注入(DI)不是“可以”,而是“必须”。最流行的库是:Swinject和Uber的Needle。

\n\n

通过Swinject注册依赖关系的示例:

\n\n
import Swinject\                

博客

书籍推荐