Swift入门教程:iOS开发第一步 —— 一个前端仔的硬核转型手记
上周五晚上十点半,我瘫在工位上盯着屏幕上那行红色报错 Missing required module 'SwiftShims',手里捏着半凉的瑞幸,心里默念:“这破玩意儿要是再编不过,我就把MacBook扔进朝阳门地铁站的垃圾桶。”
别误会,我不是被产品经理逼着写原生App(虽然他也提过好几次“你们前端能不能顺手搞个iOS版?”),而是——简历焦虑了。作为一个在北京通勤一小时、每天挤10号线像沙丁鱼罐头一样的前端工程师,我发现自己投出去的简历要么石沉大海,要么 HR 回一句:“我们更倾向全栈或懂移动端的同学。”
行吧,那就学 Swift 吧。反正我平时就爱翻 GitHub 上的开源项目源码,命令行比 GUI 用得还溜,说不定还能给公司省点外包预算?(老板:你想多了)
为啥是 Swift?不是 Flutter、React Native,也不是 Objective-C?
我知道你在想什么:“都 2024 年了,还写原生 iOS?有病吧?”
先说结论:如果你想真正理解 Apple 生态、做出符合 HIG(Human Interface Guidelines)的 App,或者准备跳槽去字节/美团这类大厂(他们很多核心 App 还是原生),Swift 是绕不开的门槛。
当然,我也试过其他方案:
| 技术栈 | 优点 | 缺点 | 适合谁 |
|---|---|---|---|
| Swift (原生) | 性能最强、API 最新、审核最稳 | 学习曲线陡、Xcode 偶尔抽风 | 想深耕 iOS / 跳槽大厂 |
| Flutter | 跨平台、热重载快、UI 自由 | 包体积大、原生交互需桥接、审核有玄学风险 | 初创公司 / MVP 快速验证 |
| React Native | 前端友好、社区大 | 性能一般、iOS/Android 行为不一致 | 已有 React 经验的团队 |
| Objective-C | 老项目维护必备 | 语法反人类、ARC 内存管理劝退新人 | 遗留系统维护者 |
作为一个喜欢研究源码的人,我其实对 Flutter 的渲染机制挺感兴趣,但当我看到某同事的 App 因为“使用私有 API”被拒审三次后,我果断放弃了跨平台幻想。Apple 的生态,就得用 Apple 的语言来玩。
第一步:环境搭建 —— Xcode 的“初次见面,请多指教”
打开 Mac App Store,下载 Xcode。友情提示:别在周五下班前开始下! 我上次在双11大促前夜下 Xcode,结果 12GB 的安装包卡到凌晨两点,第二天晨会直接睡死在 Zoom 里(别问,问就是 P0 故障复盘会)。
装完之后,打开终端,输入:
swift --version
如果输出类似:
Swift version 5.9 (swiftlang-5.9.0.124.1 clang-1500.0.40.1)
Target: arm64-apple-macosx14.0
恭喜,你已经迈出了第一步!比我还强——我第一次输的是 swift -v,然后被无情嘲讽:“Bro, that’s not a git command.”
Hello World 不是重点,重点是理解 Swift 的“性格”
Swift 其实是个很“傲娇”的语言:它既想保持 C 系语言的性能,又想拥有 Python/Ruby 的简洁。比如这段代码:
let names = ["Alice", "Bob", "Charlie"]
let greetings = names.map { "Hello, \($0)!" }
print(greetings)
// 输出: ["Hello, Alice!", "Hello, Bob!", "Hello, Charlie!"]
是不是有点像 JS 的 map?但注意:let 是不可变的,var 才是可变的。这点和 JS 反着来,刚上手时我老是写成 var name = "Claude",结果被同事吐槽:“你这是怕内存不够用吗?”
关于书籍:别信“7天精通”,老老实实看官方文档
我一开始买了本《Swift 编程权威指南》,结果前三章讲类型推断讲得我直打哈欠。后来发现 Apple 官方的 Swift Programming Language Guide 才是真·圣经——免费、更新快、例子全是 Playgrounds 实时运行的。
另外推荐一本实战书:《iOS Programming: The Big Nerd Ranch Guide》。虽然名字中二,但它的项目驱动式教学特别适合我这种“不动手就学不会”的人。上周我照着它写了个体感控制的小球动画,发到朋友圈后,产品经理居然问我:“这个能加到我们 App 的引导页吗?”(内心 OS:你上周还说要做极简风呢!)
SwiftUI vs UIKit:新时代 vs 老江湖
这里必须聊个灵魂问题:新手到底该学 SwiftUI 还是 UIKit?
我的建议是:如果你从零开始,且目标是 iOS 15+,直接上 SwiftUI。
为什么?因为:
- 声明式语法:UI 和逻辑高度耦合,改个颜色不用翻 3 个文件;
- Preview 实时预览:再也不用每次改个按钮都 Build 3 分钟;
- Apple 力推:WWDC 每年都在加新特性,未来肯定是主流。
当然,现实很骨感。我们公司的老项目还是 UIKit + Storyboard,每次 merge 代码都要祈祷没冲突——Storyboard 的 XML 冲突简直比 Git 冲突还难解。
但作为新人,你没必要背历史包袱。试试这个 SwiftUI 的 “Hello World”:
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Text("Hello, iOS!")
.font(.largeTitle)
.foregroundColor(.blue)
Button("Click me") {
print("Button tapped!")
}
}
.padding()
}
}
保存后,右边的 Canvas 自动渲染出界面。点击按钮,控制台立刻打印日志。这种即时反馈,真的会上瘾。
踩坑实录:那些让我想砸键盘的瞬间
坑 1:@State 和 @Binding 到底啥区别?
刚开始写状态管理,我总搞混这两个属性包装器。后来我悟了:
@State:我是这个值的爹(Owner)@Binding:我只是个传话的(Proxy)
比如:
struct ParentView: View {
@State private var isActive = false
var body: some View {
ChildView(isActive: $isActive) // 注意 $ 符号!
}
}
struct ChildView: View {
@Binding var isActive: Bool // 不是 @State!
var body: some View {
Toggle("Active", isOn: $isActive)
}
}
漏掉 $?恭喜,你将收获一段长达两小时的 Debug 之旅。
坑 2:App Store 审核的“潜规则”
我第一个小工具 App(一个命令行快捷启动器)被拒了两次,理由是:
“Your app provides limited functionality and does not offer sufficient value to the user.”
翻译成人话:“你这玩意儿连个登录都没有,也敢上架?”
后来我硬加了个“每日 Swift 小技巧”页面(数据来自 GitHub Gist),第三次才过审。所以提醒各位:别做纯工具类小应用,至少包装点内容。
简历怎么写?别只写“熟悉 Swift”
现在回到最初的问题:学 Swift 对简历有帮助吗?
有,但前提是你得做出东西来。
别写“掌握 Swift 基础语法”——HR 看了只会划走。要写:
- “使用 SwiftUI 开发个人效率工具 App,集成 Core Data 实现离线缓存,上架 App Store”
- “通过阅读 Alamofire 源码,实现自定义网络拦截器,减少 30% 冗余请求”
- “优化启动时间:将 didFinishLaunching 时间从 1.2s 降至 0.4s”
数字 + 场景 + 结果,才是简历王道。
顺便安利:GitHub 上有个 Open Source iOS Apps 列表,随便挑一个 Star 高的项目 clone 下来跑一跑,比刷 LeetCode 实用多了。
最后几句掏心窝子的话
学 Swift 的这两个月,我最大的感受是:Apple 的生态壁垒是真的高,但一旦进去,体验是真的爽。
动画丝滑到让你怀疑人生(UIViewPropertyAnimator 真香),内存管理自动到几乎不用管(ARC yyds),甚至连崩溃日志都格式清晰(对比 Android 的 stack trace… 哎)。
当然,Xcode 卡顿、Simulator 抽风、证书配置像解谜游戏……这些痛我也都经历过。但每次看到自己写的 App 在真机上流畅运行,那种成就感,比修复一个线上 P0 Bug 还爽。
所以,如果你也在北京挤地铁、刷 BOSS 直聘、焦虑简历没亮点——
不如今晚回家,打开终端,敲下 swift --version。
你的 iOS 开发第一步,可能就从这一行命令开始。
(P.S. 我那个命令行启动器 App 已经上架了,叫 “QuickRun”,搜不到别怪我,毕竟它现在只有 3 个用户——我和我俩朋友 😅)

评论 0