返回文章列表

SwiftUI 系列 15|我会怎样从零搭一个可维护的 SwiftUI 项目

真正决定项目后期好不好改的,不是模板高级不高级,而是状态边界、页面职责和组件抽象是不是从一开始就摆对了

如果让我从零搭一个 SwiftUI 项目,我最先考虑的不会是目录长什么样,也不会先纠结:

  • 是不是要上很完整的架构模板
  • 是不是要先抽很多基础层

我更先想的是这几件事:

  • 状态怎么流动
  • 页面职责怎么切
  • 组件何时抽、抽到什么程度
  • 项目三个月后会不会开始难改

因为很多 SwiftUI 项目最初都挺轻,真正的分水岭往往出现在两三个月后:

  • 页面越来越多
  • 状态越来越散
  • 组件复用越来越随意
  • View 里开始堆业务逻辑

所以“可维护”真正要解决的是增长后的稳定性,而不是第一周的开发速度。

一、我不会一开始就搭很重的架构壳,而是先把职责立清

从零起项目时,最常见的误区之一就是:

  • 业务还没展开
  • 先把一整套看起来很完整的架构铺满

这并不一定错,但风险是:

  • 抽象过早
  • 结构和真实业务不贴
  • 团队后面会不断绕过它

所以我更倾向于:

  • 先让职责边界清楚
  • 再随着复杂度逐步加层

比起“第一天就大而全”,我更看重“第一个月都还顺手”。

二、我最先明确的通常是三层:页面层、状态层、能力层

1. 页面层

负责:

  • 结构
  • 组件组合
  • 页面状态映射

2. 状态层

负责:

  • 业务状态
  • 异步流程
  • 页面语义状态切换

3. 能力层

负责:

  • 网络
  • 存储
  • 领域服务
  • 通用组件与样式能力

这三层未必一开始就要拆得非常细,但意识必须先有。
否则 SwiftUI 项目很容易滑向“所有东西都直接写在 View 里”。

三、我会非常警惕“巨型 View”

SwiftUI 写 UI 很顺手,所以最容易出现的坏味道之一就是:

  • 结构写在 View
  • 请求写在 View
  • 状态判断写在 View
  • 文案拼装也写在 View

早期看当然很快,但项目一复杂,View 会迅速变成:

  • 难读
  • 难改
  • 难测

这时问题不是 SwiftUI 不行,而是你让 View 承担了过多非展示职责。

四、组件复用我会故意慢半拍,而不是一开始就抽得很狠

很多团队一开始很容易追求“通用组件库”。
但真实项目里,过早抽象往往比稍晚抽象更危险:

  • 接口会被设计得过宽
  • 为了未来可能的场景预埋很多选项
  • 组件看起来复用,实际上谁用谁难受

所以我更愿意让组件在一两个真实页面里先长出来,等模式足够稳定后再抽。
这样抽出来的组件通常更贴近真实使用,而不是抽象体操。

五、状态边界通常比目录结构更重要

很多项目一开始会花很多时间争论:

  • Feature-first 还是 Layer-first
  • 文件夹该怎么分

这些当然重要,但我更在意的是:

  • 哪些状态归页面自己管
  • 哪些状态归外部业务对象管
  • 哪些状态该共享,哪些不该共享

因为真正决定维护成本的,往往不是目录名字,而是状态有没有到处乱跑。

六、可维护性的核心,其实是让每一层都“说得清自己负责什么”

如果一个项目后期越来越难改,通常都有这些信号:

  • 页面结构看不出主次
  • 状态归属越来越模糊
  • 组件边界越来越抽象
  • 一改需求就要横跨很多层补逻辑

所以一个可维护的 SwiftUI 项目,我最看重的通常不是“高级感”,而是:

  • 页面一眼能读
  • 状态一眼能分
  • 组件边界自然
  • 业务逻辑不堆在 View 里

这四件事都很朴素,但长期特别值钱。

七、结论:从零搭 SwiftUI 项目,真正要先摆对的是边界,不是模板

如果只用一句话总结,我会说:

从零搭一个可维护的 SwiftUI 项目,最重要的不是先选一个多完整的模板,而是先把状态边界、页面职责和组件抽象时机摆对。

这些边界一旦立住,项目会越长越稳;
边界没立住,再高级的模板也很容易被真实业务一点点冲散。