这不是一篇「Objective-C 已经过时了」的文章。恰恰相反,我认为理解 OC 是理解 Swift 和 SwiftUI 为什么长成这样的前提。这篇写的是我在这条路上的几个真实分水岭。
第一道分水岭:语法不是重点,思维才是
最开始接触 Swift,很多人(我也是)以为它只是「写法更简洁的 OC」。但真正开始写之后才发现,变化的不是「怎么写」,而是「怎么想」:
可选类型把「可能为空」变成了编译期就要面对的问题,而不是靠运行时小心翼翼;
值类型与引用类型的区分,让「这个东西会不会被别处改掉」变成可推理的事;
协议与扩展把「能力」从「继承」里解耦出来,组合终于比继承更顺手。
所以第一道分水岭不是语法,而是「从运行时自信,转向编译期确定」。
第二道分水岭:从「命令式改界面」到「描述式表达界面」
这是我感受最强的一步,也是 SwiftUI 真正让人觉得「不一样」的地方。
传统做法是先拿到一个控件,然后在不同时机去改它的属性:文本变了改文本、列表变了重载列表。界面是「被一步步改出来的」。
SwiftUI 换了个思路:你只描述「在某个状态下界面应该长什么样」,状态一变,界面自己更新。这带来两个直接后果 —— 少了一大堆「同步界面」的代码,但也强迫你把状态想清楚,因为状态不清楚,界面就不可能对。
第三道分水岭:状态管理才是真正的主线
写过一段 SwiftUI 之后,我最大的体会是:**它的难点不在布局,而在状态**。
一段界面在不同的数据状态下表现不同,而数据来源可能有多个,于是「谁拥有这份状态、谁能改它、改了之后谁应该跟着变」就成了核心问题。我后来总结出一条很实用的判断方式:
这份状态只影响自己这一个界面 —— 就让它离界面近一点;
这份状态要被多个界面共享 —— 就往上提,让拥有权清晰;
这份状态来自外部(网络、数据库)—— 就要考虑加载中、失败、空数据这三种情况。
最后那条尤其重要:把「没有数据」和「加载失败」当成正常状态来设计,而不是等出错了再补一个提示。
第四道分水岭:什么该交给框架,什么该自己控制
越写越会明白,框架帮你做的每一件事,都对应着你失去的一点控制权。真正让人舒服的做法是划清边界:
界面结构交给框架 —— 这是它的强项;
业务规则和数据处理自己控制 —— 这部分不该被界面框架绑死;
持久化和网络独立成层 —— 这样换界面框架时不用重写一遍。
OC 学到的东西,一点没浪费
回头看,从 OC 过来的这几样能力,在 Swift 时代反而更值钱:
对内存与生命周期的敏感:知道什么会持有谁、什么时候会释放,这在排查问题时非常关键;
对运行时机制的理解:能解释清楚「为什么这里会崩」,而不是只知道加个判断绕过去;
对外部依赖的克制:用第三方库之前先想清楚它买走了什么。
给正在走这条路的人三点建议
先把可选类型和值类型这两件事吃透,它是后面所有内容的地基;
不要一开始就追新 API,先把一个真实的小需求做完,跑通一遍完整链路;
把状态管理当重点学,它比布局难得多,也重要得多。
技术演进从来不意味着「旧的没用」,而是「多了一套表达方式」。真正有价值的,是你能根据问题,选一个合适的表达方式。