返回文章列表

SwiftUI 系列 01|SwiftUI 到底适合做什么,不适合做什么?

真正值得问的不是它能不能替代 UIKit,而是它最擅长承载哪类页面复杂度

很多人第一次接触 SwiftUI,最常问的问题都是:

  • 它能不能替代 UIKit
  • 新项目是不是应该全用 SwiftUI
  • 老项目值不值得迁

这些问题当然重要,但如果一开始就把讨论放在“替代”上,往往会把判断做得很极端。
更实际的问法应该是:

SwiftUI 最擅长承载什么样的页面复杂度,什么样的问题它反而不一定占优?

只有这个问题先答清楚,后面“要不要用”“用到什么程度”才会有现实意义。

一、SwiftUI 真正厉害的地方,不是语法更短,而是它把“状态变化如何映射成界面”这件事放到了第一位

UIKit 的默认思路更像:

  • 先有 view
  • 再去更新 view
  • 再处理多个 UI 部件之间的同步关系

SwiftUI 的默认思路则更接近:

  • 先有状态
  • 再描述“这种状态下界面应该长什么样”

这意味着它天然更适合那些“界面主要复杂度来自状态表达”的页面。
比如:

  • 空态 / loading / loaded / error 切换明显的页面
  • 表单页
  • 设置页
  • 展示型详情页
  • 由一组业务状态驱动多个小组件联动的页面

这些页面在 UIKit 里当然也能写,但你经常需要手动维护很多同步关系。
SwiftUI 的优势恰恰在于,它让这类关系更容易被表达成一个整体。

二、它特别适合“状态比交互细节更重要”的业务页面

很多业务页面的真正难点不是底层控件技巧,而是:

  • 当前是哪个状态
  • 不同状态下该显示什么
  • 某个业务动作之后哪些区域要一起变化

例如:

  • 个人中心
  • 设置页
  • 文章详情页
  • 搜索结果页
  • 订单详情页

这类页面很少要求你做极限级别的滚动协调或手势设计,但会大量涉及:

  • 状态切换
  • 条件显示
  • 组件组合
  • 局部刷新

这些事情正是 SwiftUI 最顺手的地方。

三、它也很适合“迭代快、UI 改动频繁”的页面

这点在真实团队里非常重要。

有些页面并不是技术上特别难,而是产品改动频繁:

  • 文案改
  • 结构改
  • 卡片顺序改
  • 某个模块显示条件改

在这类场景下,SwiftUI 的优势往往不只是“代码更少”,而是你修改 UI 结构的心智负担更低。
你更容易把页面当成一棵状态驱动的结构树去改,而不是在很多局部 view 之间来回 patch。

所以如果一个团队的现实情况是“页面改得很勤”,SwiftUI 通常会很有吸引力。

四、但 SwiftUI 并不天然适合所有“复杂页面”

这也是最需要说清楚的一点。

很多人听到“SwiftUI 更现代”,就会下意识把它等同于“所有页面都更适合”。
但真实项目里,复杂页面的复杂度来源不一样。

如果一个页面的核心难点是:

  • 极其精细的滚动控制
  • 大量底层手势协调
  • 非常定制的动画时序
  • 对渲染和交互细节掌控要求极高

那 SwiftUI 就未必天然更轻松。

不是说它做不到,而是:

  • 有些能力需要绕
  • 有些时候要混 UIKit
  • 有些底层行为调试成本更高

所以“页面复杂”这件事本身不是判断标准,关键是它复杂在什么地方。

五、一个更实用的判断:页面的核心难点是“状态表达”还是“底层控制”

这是我自己最常用的判断方式。

如果页面的核心难点是:

  • 多个业务状态怎么映射到界面
  • 组件怎么随着状态变化自然组合
  • 页面结构怎么保持清晰

那 SwiftUI 往往很合适。

如果页面的核心难点是:

  • 底层交互怎么精确控制
  • 复杂滚动行为怎么协调
  • 非标准动画和布局行为怎么落地

那 UIKit 往往更稳,或者至少更“可控”。

这个判断并不绝对,但在真实项目里足够实用。
它比“SwiftUI 能不能替代 UIKit”这个问题更能指导日常选型。

六、老项目里最现实的策略通常不是“全迁”,而是“按边界混用”

如果项目已经有成熟的 UIKit 结构,最容易出问题的不是 SwiftUI 本身,而是“迁移想象过于理想”。

真实项目里,更常见也更稳的路径通常是:

  • 新页面优先用 SwiftUI
  • 已稳定的 UIKit 页面不轻易大改
  • 在需要的时候混编
  • 不追求一口气全迁

因为迁移成本本身也是业务成本。
框架切换如果没有带来明确收益,只是为了“统一栈”,那很可能得不偿失。

七、一个常见误区:把 SwiftUI 当成“UIKit 的语法升级版”

很多人学 SwiftUI 时,脑子里还是在问这些问题:

  • 这个 view 是不是只创建一次
  • 我要什么时候手动刷新
  • 为什么这里不像 UIKit 那样直接改一下就行

这些疑惑都很正常,但如果长期停留在这个角度,很难真正用好 SwiftUI。
因为 SwiftUI 不是 UIKit 的语法壳,而是一种完全不同的界面组织方式。

它要求你优先思考:

  • 状态归谁管
  • 这个状态怎么映射到 UI
  • 界面更新是不是状态流的一部分

一旦还是用 UIKit 的思维硬套,SwiftUI 最后很容易变成“看似声明式,实际上逻辑更乱”。

八、结论:SwiftUI 适不适合,不取决于它新不新,而取决于页面复杂度的来源

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

SwiftUI 最适合的不是“简单页面”,而是那些核心复杂度主要来自状态表达、界面组合和迭代频繁性的页面;而那些复杂度主要来自底层交互与精细控制的页面,它未必天然占优。

所以真正实用的判断不是“要不要用 SwiftUI”,而是:

  • 这个页面复杂在什么地方
  • SwiftUI 能不能正好吃到这类复杂度

这个问题一旦答清楚,选型通常就不会太纠结。