个人思考 2026-10-11

我的技术演进之路——从OC到SwiftUI

禾

禾安

独立开发者 · 专注移动端iOS开发

从 Objective-C 到 SwiftUI,不只是换一门语言,而是换了一套思考界面的方式。这一篇讲这条演进路上几个真实的分水岭:语法层、状态管理、以及「什么该交给框架」。

这不是一篇「Objective-C 已经过时了」的文章。恰恰相反,我认为理解 OC 是理解 Swift 和 SwiftUI 为什么长成这样的前提。这篇写的是我在这条路上的几个真实分水岭。

第一道分水岭:语法不是重点,思维才是

最开始接触 Swift,很多人(我也是)以为它只是「写法更简洁的 OC」。但真正开始写之后才发现,变化的不是「怎么写」,而是「怎么想」:

  • 可选类型把「可能为空」变成了编译期就要面对的问题,而不是靠运行时小心翼翼;

  • 值类型与引用类型的区分,让「这个东西会不会被别处改掉」变成可推理的事;

  • 协议与扩展把「能力」从「继承」里解耦出来,组合终于比继承更顺手。

所以第一道分水岭不是语法,而是「从运行时自信,转向编译期确定」。

第二道分水岭:从「命令式改界面」到「描述式表达界面」

这是我感受最强的一步,也是 SwiftUI 真正让人觉得「不一样」的地方。

传统做法是先拿到一个控件,然后在不同时机去改它的属性:文本变了改文本、列表变了重载列表。界面是「被一步步改出来的」。

SwiftUI 换了个思路:你只描述「在某个状态下界面应该长什么样」,状态一变,界面自己更新。这带来两个直接后果 —— 少了一大堆「同步界面」的代码,但也强迫你把状态想清楚,因为状态不清楚,界面就不可能对。

第三道分水岭:状态管理才是真正的主线

写过一段 SwiftUI 之后,我最大的体会是:**它的难点不在布局,而在状态**。

一段界面在不同的数据状态下表现不同,而数据来源可能有多个,于是「谁拥有这份状态、谁能改它、改了之后谁应该跟着变」就成了核心问题。我后来总结出一条很实用的判断方式:

  • 这份状态只影响自己这一个界面 —— 就让它离界面近一点;

  • 这份状态要被多个界面共享 —— 就往上提,让拥有权清晰;

  • 这份状态来自外部(网络、数据库)—— 就要考虑加载中、失败、空数据这三种情况。

最后那条尤其重要:把「没有数据」和「加载失败」当成正常状态来设计,而不是等出错了再补一个提示。

第四道分水岭:什么该交给框架,什么该自己控制

越写越会明白,框架帮你做的每一件事,都对应着你失去的一点控制权。真正让人舒服的做法是划清边界:

  • 界面结构交给框架 —— 这是它的强项;

  • 业务规则和数据处理自己控制 —— 这部分不该被界面框架绑死;

  • 持久化和网络独立成层 —— 这样换界面框架时不用重写一遍。

OC 学到的东西,一点没浪费

回头看,从 OC 过来的这几样能力,在 Swift 时代反而更值钱:

  • 对内存与生命周期的敏感:知道什么会持有谁、什么时候会释放,这在排查问题时非常关键;

  • 对运行时机制的理解:能解释清楚「为什么这里会崩」,而不是只知道加个判断绕过去;

  • 对外部依赖的克制:用第三方库之前先想清楚它买走了什么。

给正在走这条路的人三点建议

  1. 先把可选类型和值类型这两件事吃透,它是后面所有内容的地基;

  2. 不要一开始就追新 API,先把一个真实的小需求做完,跑通一遍完整链路;

  3. 把状态管理当重点学,它比布局难得多,也重要得多。

技术演进从来不意味着「旧的没用」,而是「多了一套表达方式」。真正有价值的,是你能根据问题,选一个合适的表达方式。