Swift语法精讲:从基础到进阶——一个30岁转行程序员的深圳生存笔记
作者:老陈 | 2024年12月,深圳南山
一、凌晨两点的科兴科学园
上周五晚上,我坐在科兴科学园B栋4楼的工位上,盯着屏幕上那个该死的编译错误发呆。
let result: Result<User, NetworkError> = await api.fetchUser(id: "12345")
旁边工位的00后小周探过头来:"陈哥,又卡住了?你这个泛型约束写错了吧,where子句没加。"
我叹了口气,把椅子往后一推,揉了揉发酸的眼睛。
说实话,这一幕要是放在两年前,我绝对想不到自己会坐在这里。那时候我还在东莞一家五金厂做供应链管理,每天跟Excel和供应商扯皮,月薪8500,扣完五险一金到手刚够交房租和还花呗。30岁生日那天,我一个人坐在出租屋里吃了碗泡面,看着窗外灰蒙蒙的天,突然觉得这辈子可能就这样了。
"不行,得换个活法。"
那天晚上,我做了一个可能这辈子最疯狂的决定——转行当程序员。
老婆当时差点跟我翻脸:"你疯了吧?30岁了还折腾什么?现在工作虽然钱不多,但稳定啊!"
"稳定个屁,稳定穷。"我记得自己当时是这么回的。
后来她看我态度坚决,也没再拦着,只是说了句:"给你一年时间,要是搞不出来,就老老实实回去上班。"
就这样,我开始了苦逼的自学之路。报了个线上班,每天下班后学到凌晨一两点,周末泡图书馆。从Python入门,到前端Vue,最后阴差阳错选了iOS开发——因为当时看到一篇帖子说iOS开发薪资高,深圳这边机会多。
天真了不是?
学Swift那段时间,真的是我人生中最崩溃的日子之一。今天这篇文章,我想把自己踩过的坑、总结出来的Swift语法精华,一次性讲清楚。既是给自己做个复盘,也希望能帮到跟我一样在路上挣扎的兄弟。
二、Swift基础:那些让我怀疑智商的语法
2.1 变量与常量:let和var的爱恨情仇
刚开始学Swift的时候,我特别不理解为什么要有let和var的区分。在Python里,一个变量想改就改,多自由。
let name = "老陈" // 常量,不能改
var age = 30 // 变量,可以改
后来我才明白,这是Swift在逼你养成好习惯。let能用的地方就别用var,这叫不可变性优先原则。编译器会帮你检查,万一你不小心改了不该改的值,直接编译报错,比运行时出bug强一万倍。
💡 面试Tips:面试官问"为什么Swift要区分let和var",别只说"let是常量var是变量"这种废话。你要说:这体现了Swift对安全性和可预测性的追求,不可变值在多线程环境下天然安全,也利于编译器优化。
2.2 可选类型:让我第一次想砸键盘的东西
var userName: String? = nil
// userName = "老陈"
if let name = userName {
print("你好,\(name)")
} else {
print("名字是空的,兄弟")
}
第一次接触Optional的时候,我整个人是懵的。什么?、什么!、什么if let、什么guard let,这都什么鬼?
但后来在实际项目里用多了,才发现这玩意儿是真香。以前写Java的时候,NullPointerException简直是家常便饭,线上动不动就崩。Swift用Optional从语言层面逼你处理空值,虽然写代码的时候烦了点,但确实少了很多线上事故。
去年十月面试的时候,有一道题我印象特别深:
面试题:
Optional的底层实现是什么???运算符的优先级怎么理解?
我当时答得磕磕巴巴,后来回去查了资料才搞清楚——Optional本质上是一个枚举:
enum Optional<Wrapped> {
case none
case some(Wrapped)
}
就这么几行代码,解决了无数程序员几十年的空指针噩梦。你说苹果这帮人是不是天才?
2.3 闭包:从看不懂到离不开
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
// [2, 4, 6, 8, 10]
闭包这东西,说白了就是匿名函数。但Swift的闭包语法糖太多了,$0、$1、尾随闭包、逃逸闭包……刚学的时候看得我头皮发麻。
但真正让我开窍的,是上个月重构项目里的一段网络请求代码。原来写了一大坨回调嵌套,看着像意大利面,用闭包重构之后清爽得不像话:
func fetchUserData(completion: @escaping (Result<User, Error>) -> Void) {
URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else {
completion(.failure(error ?? NetworkError.unknown))
return
}
// 解析数据...
completion(.success(user))
}.resume()
}
💡 面试Tips:
@escaping和@noescape(现在默认non-escaping)的区别是高频面试题。核心就是:逃逸闭包会在函数返回后才执行,所以要用[weak self]避免循环引用。这个答不上来,基本就凉了。
三、Swift进阶:让我从"能写"到"写得好"
3.1 协议与泛型:iOS开发的内功心法
protocol Repository {
associatedtype Entity
func fetch(id: String) async throws -> Entity
func save(_ entity: Entity) async throws
}
class UserRepository: Repository {
typealias Entity = User
func fetch(id: String) async throws -> User {
// 实现...
}
func save(_ entity: User) async throws {
// 实现...
}
}
协议和泛型,是我学了大半年才真正理解的东西。以前写代码就是面向过程,一个函数怼到底,代码又臭又长。后来慢慢学会了用协议来抽象,用泛型来复用,代码质量直接上了一个台阶。
今年三月跳槽的时候,新公司面试考了一道泛型题:
面试题:实现一个泛型栈(Stack),要求支持push、pop、peek操作,并且要遵循
Sequence协议。
这道题我准备过,答得还算流畅。面试官后来跟我说,这道题能刷掉60%的候选人。
struct Stack<Element> {
private var items: [Element] = []
mutating func push(_ item: Element) {
items.append(item)
}
mutating func pop() -> Element? {
return items.popLast()
}
func peek() -> Element? {
return items.last
}
}
extension Stack: Sequence {
func makeIterator() -> IndexingIterator<[Element]> {
return items.makeIterator()
}
}
3.2 Async/Await:Swift并发的革命
func loadDashboard() async throws -> DashboardData {
async let user = fetchUser()
async let orders = fetchOrders()
async let notifications = fetchNotifications()
return try await DashboardData(
user: user,
orders: orders,
notifications: notifications
)
}
Swift 5.5引入的async/await,是我觉得iOS开发近几年最大的变革。以前用CompletionHandler写异步代码,嵌套三四层是常态,代码可读性极差。有了async/await之后,异步代码写得跟同步一样清晰。
但说实话,刚上手的时候也踩了不少坑。比如@MainActor的使用、Task的生命周期管理、还有AsyncSequence的背压处理……每一个都是血泪教训。
上个月,我在项目里引入了Agentic AI的概念——没错,就是现在火得不行的AI Agent。我们用Swift的并发特性,搭建了一个多Agent协作的框架:
actor AgentCoordinator {
private var agents: [Agent] = []
func register(_ agent: Agent) {
agents.append(agent)
}
func execute(task: Task) async throws -> TaskResult {
// 将任务分发给不同的Agent
let results = await withTaskGroup(of: AgentResponse.self) { group in
for agent in agents {
group.addTask {
return await agent.process(task)
}
}
var responses: [AgentResponse] = []
for await response in group {
responses.append(response)
}
return responses
}
return try merge(results)
}
}
这个actor是Swift并发里的核心概念,它保证了内部状态的线程安全。在Agentic AI场景下,多个Agent并发执行任务,actor能避免数据竞争,简直是神器。
💡 面试Tips:现在面试iOS岗,问async/await和actor的概率越来越高。尤其是结合Agentic AI这种热门话题,面试官很喜欢问"你怎么用Swift并发实现一个多Agent系统"。如果你能讲清楚
TaskGroup、actor、@MainActor的区别和使用场景,基本就能拿到offer。
3.3 Property Wrapper与Result Builder:Swift的魔法
@propertyWrapper
struct Validated<Value> {
private var value: Value
var wrappedValue: Value {
get { value }
set {
precondition(validate(newValue), "Validation failed")
value = newValue
}
}
init(wrappedValue: Value) {
self.value = wrappedValue
precondition(validate(wrappedValue))
}
func validate(_ value: Value) -> Bool {
// 验证逻辑
return true
}
}
struct User {
@Validated var name: String
@Validated var age: Int
}
Property Wrapper和Result Builder是Swift里比较高级的特性,日常开发不一定会频繁用到,但在框架设计和DSL构建时特别有用。SwiftUI的@State、@Binding本质上就是Property Wrapper。
四、从15k到22k:我的薪资逆袭之路
说了这么多技术,聊点现实的。
去年十月第一次面试,挂了。原因是基础不扎实,算法题一道没做出来。那天从南山区的写字楼出来,坐在地铁里,看着窗外的广告牌,心里五味杂陈。
今年一月,第二次面试,拿到一个15k的offer。当时犹豫了很久——15k,扣完五险一金到手12k出头,在深圳关内租个单间都不够。但想着先入行再说,就接了。
今年六月,在公司干了半年,把项目里的网络层用Swift的泛型和协议全部重构了一遍,还引入了Combine做响应式数据流。领导看在眼里,年中调薪加了2k。
上个月,也就是十一月,我跳槽了。新公司做AI应用,要求熟悉Swift并发和内存管理。面试的时候,我把之前那个Agentic AI的框架经验一讲,面试官眼睛都亮了。最后谈薪,月薪从15k涨到22k,涨了将近50%。
签完offer那天晚上,我跟老婆去海岸城吃了顿日料,花了600多。她笑着说:"看来当初让你折腾是对的。"
我没说话,只是心里想:这哪是折腾,这是拼命。
五、给同路人的几句真心话
5.1 别怕基础,基础决定上限
很多人学Swift,上来就想搞SwiftUI、搞架构,基础的语法、内存管理、协议泛型都不愿意花时间。结果呢?面试一问三不知,项目里写出来的代码一坨屎。
我的建议是:花至少三个月打基础。把Swift官方文档过一遍,把《Swift Programming Language》啃完,把WWDC的视频看几遍。这些东西看着枯燥,但真的是内功。
5.2 项目经验比证书重要
转行的人最大的劣势就是没有项目经验。怎么破?自己造项目。
我当时做了三个项目放到GitHub上:
- 一个天气App(练UI和网络请求)
- 一个记账App(练CoreData和本地存储)
- 一个AI聊天助手(练并发和第三方库集成)
面试的时候,直接把GitHub链接甩给面试官,比什么简历都管用。
5.3 保持学习,但别焦虑
技术圈最不缺的就是焦虑。今天SwiftUI,明天Agentic AI,后天又是新的框架。你追不完的。
我的策略是:核心基础吃透,新技术了解原理,项目里用到再深入。别什么都学,什么都学等于什么都没学。
5.4 30岁转行,不丢人
我知道很多30+的朋友想转行但又犹豫。我想说的是:种一棵树最好的时间是十年前,其次是现在。
我30岁转行,31岁拿到22k的offer。在深圳这个城市,22k不算高,但比起两年前在工厂里拿8500的日子,我已经很满足了。
更重要的是,我找到了一个能持续成长的方向。在这个行业里,只要你愿意学,永远有上升空间。
六、写在最后
写这篇文章的时候,已经是凌晨一点了。窗外的南山灯火通明,远处还能看到深圳湾大桥的轮廓。
我合上电脑,伸了个懒腰。明天还要早起开会,讨论下个季度的Agentic AI项目规划。
从五金厂到写字楼,从8500到22k,从连let和var都分不清到能独立设计一套多Agent框架——这条路我走了两年。
累吗?累。后悔吗?不后悔。
如果你也是正在转行路上的朋友,或者正在为面试发愁的兄弟,希望这篇文章能给你一点帮助。技术这东西,没有捷径,但有方法。把基础打牢,把项目做扎实,机会来的时候你才能接得住。
共勉。
附录:Swift学习资源推荐
| 资源 | 说明 | 推荐指数 |
|---|---|---|
| Swift官方文档 | 最权威的语法参考 | ⭐⭐⭐⭐⭐ |
| WWDC Sessions | 每年新技术的第一手资料 | ⭐⭐⭐⭐⭐ |
| 《Swift编程权威指南》 | 系统学习首选 | ⭐⭐⭐⭐ |
| Hacking with Swift | 免费教程,项目驱动 | ⭐⭐⭐⭐ |
| 雷神的iOS开发进阶 | 中文社区优质内容 | ⭐⭐⭐⭐ |
本文为原创内容,转载请注明出处。
如果你有任何问题,欢迎在评论区留言,我看到都会回复。
—— 老陈,2024年12月于深圳南山


评论 0