返回文章列表

SwiftUI 系列 07|从 UIKit 转到 SwiftUI,需要先改变哪些思维方式?

真正难的不是学新 API,而是放下“我来手动驱动界面”的默认习惯

很多 UIKit 开发者第一次转 SwiftUI,最痛苦的地方并不是不会写语法,而是总觉得:

  • 明明 API 也不复杂
  • 但为什么写起来总不顺

原因往往不是技术点没学会,而是底层思维模式还没切过来。

因为 UIKit 默认是在问:

  • 我现在要创建哪个 view
  • 我什么时候更新它
  • 我怎么手动保持它和数据一致

而 SwiftUI 更像是在问:

  • 当前状态是什么
  • 在这种状态下界面应该长什么样
  • 当状态变化时,界面应该如何自然重组

这两个思路不是简单替换关系,而是控制权位置发生了变化。

一、第一件要放下的,是“界面更新主要靠我手动驱动”

UIKit 里很多经验都围绕这个展开:

  • 哪个时机 reload
  • 哪个时机 setNeedsLayout
  • 哪个回调里改某个 subview

SwiftUI 当然也需要你管理状态,但它希望你做的是:

  • 管理状态来源
  • 管理状态边界
  • 管理状态如何映射成 UI

而不是继续把心力主要放在“我该怎么手动刷新界面”。

如果这个习惯不改,后面最容易出现的情况就是:

  • SwiftUI 写法看起来是声明式
  • 但脑子里还是 UIKit 的命令式驱动

最后代码会变成两种思维混着写,既没吃到 SwiftUI 的优势,也丢了 UIKit 的明确控制感。

二、第二件要放下的,是把 View 当成稳定对象

这是 UIKit 背景开发者最容易默认带进来的习惯。

在 UIKit 里,你很自然会把一个页面或 cell 看成:

  • 一个被创建出来的对象
  • 后续不断被更新

但 SwiftUI 的 View 更像一种状态描述。
它不是“一个我长期抓着改的对象”,而更像“当前状态下界面的结构表达”。

这意味着你如果始终从“这个 View 会一直在,我只要继续改它”出发,后面会很容易在:

  • 生命周期判断
  • 状态存放位置
  • 异步任务绑定

这些问题上频繁踩坑。

三、第三件要放下的,是过度依赖局部 patch 修 UI

UIKit 开发里很常见的路径是:

  • 先把 view 摆出来
  • 哪里不对就改哪里
  • 某个控件偏一点就局部 patch 一下

这种方式在 SwiftUI 里也不是完全不能用,但如果你一直这样做,页面很容易变成:

  • modifier 堆很多
  • 结构层次不清
  • 一处小修引发另一处布局变化

因为 SwiftUI 更鼓励你先把结构表达清楚,再让局部修饰附着其上。
如果结构本身就不稳,局部 patch 会把问题越修越碎。

四、第四件要改变的是:少从“控件”,多从“状态流”思考

UIKit 思维里,很多页面组织都是以控件为中心的:

  • 这个 label 显示什么
  • 这个按钮是否禁用
  • 这个 tableView 什么时候 reload

SwiftUI 更鼓励你从状态流出发:

  • 页面现在是什么状态
  • 这个状态应该映射出哪些 UI 片段
  • 某个动作后状态如何演进

这个变化很关键,因为它会直接影响:

  • 你怎么设计 ViewModel
  • 你怎么拆组件
  • 你怎么判断哪些状态该共享,哪些不该共享

五、第五件要改变的是:别急着把所有 UIKit 经验都翻译成 SwiftUI 对应写法

很多人学 SwiftUI 时会下意识这样问:

  • 这个相当于 UIKit 里的什么
  • 这个生命周期对应哪个回调
  • 这个行为是不是等于 reloadData

这类映射在入门时有帮助,但如果长期依赖,会形成一个问题:

  • 你一直在找 UIKit 对应物
  • 却没真正接受 SwiftUI 是另一套组织方式

真正用顺手的转折点,通常不是“我终于找到了所有对应关系”,而是:

我开始直接用 SwiftUI 的问题意识去思考页面,而不是先翻译回 UIKit 再做决定。

六、一个更实用的过渡方式:不要追求“立刻完全换脑”,先把几个高频问题问法改掉

我觉得最有帮助的不是逼自己一夜切换思维,而是先把下面这些问题问法改掉:

把:

  • 我什么时候刷新这个 view

改成:

  • 什么状态变化应该驱动这个区域更新

把:

  • 这个控件该在哪个时机改

改成:

  • 这个值应该归谁拥有

把:

  • 这个页面出现一次还是多次

改成:

  • 这段任务该和什么状态或生命周期绑定

这种问法变化看起来小,但它会慢慢把你的默认思维往 SwiftUI 那边拉。

七、结论:从 UIKit 转到 SwiftUI,最重要的不是记住新语法,而是把控制权思维重新摆位

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

从 UIKit 转到 SwiftUI,真正需要改变的不是“代码写法”,而是从“我来手动驱动界面”转向“我来定义状态和边界,让界面跟着状态成立”。

一旦这件事开始发生,很多原本觉得“SwiftUI 怎么这么别扭”的地方,反而会慢慢变得自然。