本节摘要:iOS 生态是「阳台花园」要生长的土壤。本节画出土壤剖面:从设备硬件到 App Store 的五个分层,Swift、UIKit、SwiftUI 各在哪一层、互相怎么咬合;说清为什么初学者应该直接从 Swift 加 SwiftUI/UIKit 入手而把 Objective-C 留给"认得出即可"。读完你手里有一张生态地图,后面每一章的代码都能在这张图上找到落点。
整本日记的第一铲土,要铲在"我写的代码到底经过了什么才变成屏幕上的界面"这个问题上。不搞清这个,后面学布局、学导航都像在不知道水流方向的情况下挖渠。
iOS 生态从下往上可以剖成五层:硬件设备(iPhone、iPad、Apple Watch、Apple TV 与作为开发机的 Mac)、操作系统(iOS、iPadOS、watchOS、tvOS、macOS)、编程语言(Swift 与老将 Objective-C)、系统框架(Foundation、UIKit、SwiftUI、Core Data 等)、分发渠道(App Store 与其审核体系)。开发者站在语言层和框架层上干活,但每一层都会回来找你麻烦——设备层决定屏幕尺寸与传感器,系统层决定 API 可用性,分发层决定你的 App 最后能不能到达用户手里。

地图上第四层里并排站着 UIKit 和 SwiftUI,它们是这本日记后四章的主角。先各看十行代码,感受两种长法——左边是命令式的 UIKit,右边是声明式的 SwiftUI,功能完全相同:屏幕中央显示一株植物的名字。
// UIKit 长法:先造视图,再一步步配置属性,最后挂到树上 import UIKit class PlantViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemBackground // 先铺底色 let label = UILabel() // 造一片"叶子" label.text = "龟背竹" // 手动设定内容 label.font = UIFont.systemFont(ofSize: 24, weight: .bold) label.translatesAutoresizingMaskIntoConstraints = false // 声明:我要用 Auto Layout 管它 view.addSubview(label) // 挂到父视图(种进视图树) label.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true label.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true } } // 结果:模拟器中央出现"龟背竹"。每一步都是命令:造、设、挂、钉。
// SwiftUI 长法:只描述"给定这个名字,界面应该长什么样" import SwiftUI struct PlantCard: View { var plantName: String // 数据进门 var body: some View { // body 是一份"图纸"而非命令 Text(plantName) // 内容来自数据,不手动设 .font(.system(size: 24, weight: .bold)) } } // 使用:PlantCard(plantName: "龟背竹") 放进任意屏幕即得同样效果 // 结果:同样的中央一行字,代码里没有任何"挂到树上"的动作——系统替你种
两段代码功能一致,气质完全不同:UIKit 像拿着剪刀逐步修剪,SwiftUI 像递上一张图纸让树自己长。第 3 章走左边这条路,第 5 章走右边,最后第 6 章让它们同园共存。
Swift 在 2014 年的苹果开发者大会上首次亮相,接替已经服役多年的 Objective-C 成为主线语言。你不需要懂 Objective-C 才能开始,但要认得出它:老工程的文件、不少第三方库的底层、系统框架里那些 NS 开头的类名,都是它的痕迹。
初学者的时间分配我建议直接定为:Swift 写满全部精力,Objective-C 只记三件事——方括号调用语法是它、NS 前缀多是它留下的、看到 nil 检查风格不同的代码别慌。理由很实际:SwiftUI 只能用 Swift 写,苹果的新框架与新 API 也以 Swift 优先,你的第一份工作大概率是"在 Swift 工程里维护少量 Objective-C 存量",而不是反过来。
| 维度 | Swift | Objective-C |
|---|---|---|
| 语法风格 | 现代简洁,闭包与泛型齐全 | 方括号消息传递,冗长 |
| 空值安全 | 可选类型在编译期把关(第 2 章 2.7) | 指针可为空,运行时才炸 |
| 与 SwiftUI | 唯一可用语言 | 不可用 |
| 存量代码 | 逐年增长 | 大量存于老项目,需要能读懂 |
背景:动手写代码前,先给整个项目做一次生态定位,避免中途才发现"这条路走不通"。操作:逐层回答五个问题。结果如下表。
| 分层问题 | 阳台花园的答案 |
|---|---|
| 跑在什么设备上 | iPhone 为主,竖屏优先,iPad 兼容即可 |
| 最低支持哪个系统版本 | 选近三年的大版本,SwiftUI 的新 API 才敢用 |
| 语言 | Swift,一行 Objective-C 都不引入 |
| 框架 | 界面 UIKit 与 SwiftUI 双线(教学目的),数据用 Foundation |
| 分发 | 先不上架,本地模拟器加个人设备调试 |
解读:这张表看似空泛,实则每一行都在替你挡掉一类未来的返工——比如"最低系统版本"直接决定第 5 章能不能用 NavigationStack 这个新导航组件。变式:等你做第二个 App 时,把表格倒过来填,先定分发策略(企业内用还是上架),再倒推系统版本与框架选择,那是另一个方向的工作流。
下一节我们把地图上标着"大棚"的那块地翻出来——Xcode 装好,种子才能下地。