Swift面试:如何从容应对
想象一下:你坐在技术主管或HR对面,突然听到一个问题:"请说说Swift中类和结构体有什么区别?"。看似基础,但正是这些"简单"问题让许多候选人慌了神。如果再加入ARC、闭包和可选类型的陷阱,Swift面试可能会变成一场真正的考验。
在本文中,我们将探讨如何准备Swift面试,让你充满自信。你得到的不仅仅是理论,还有真实的代码示例、实用技巧以及面试前需要复习的主题检查清单。
为什么Swift面试如此独特?
Swift是一门年轻但非常强大的语言。它结合了底层内存管理(ARC)和高层抽象(协议、泛型、函数式编程)。面试中,你将在多个维度被考察:
- 基础语法 — 可选类型、枚举、元组、guard/if-let。
- 内存管理 — ARC、循环引用、弱引用和无主引用。
- 面向对象与面向协议编程 — 类与结构体、扩展、协议。
- 函数式特性 — 闭包、map/filter/reduce、async/await。
- iOS特性 — UIKit、ViewController生命周期、Auto Layout。
好消息是:所有这些都可以学习和练习。开始吧!
必须熟练掌握的5大主题
1. 结构体 vs 类:类型之战
这可能是Swift面试中最常见的问题。让我们通过示例来解析。
// 类 — 引用类型class Car { var model: String init(model: String) { self.model = model }}
// 结构体 — 值类型struct Bike { var model: String}
var myCar = Car(model: "Tesla")var sameCar = myCarsameCar.model = "BMW"print(myCar.model) // BMW — 引用!
var myBike = Bike(model: "Stels")var sameBike = myBikesameBike.model = "Author"print(myBike.model) // Stels — 拷贝!面试中需要强调的重点:
- 类支持继承,结构体不支持(但可以使用协议)。
- 结构体是值类型,类是引用类型。
- 结构体自动拥有成员逐一构造器。
- 在多线程环境下,结构体更安全 — 没有共享状态。
2. ARC与内存管理 — iOS开发者的主要痛点
不理解ARC(自动引用计数),Swift面试将寸步难行。最常见的问题是循环引用。
class ProfileViewController { var onLogout: (() -> Void)? func setup() { // 注意!闭包中对self的强引用 onLogout = { self.dismiss(animated: true) } }}如何修复?使用 [weak self]:
onLogout = { [weak self] in self?.dismiss(animated: true)}ARC的典型问题:
- weak和unowned有什么区别?
- 循环引用何时发生?
- ARC如何与闭包协同工作?
3. 闭包 — 从简单到复杂
Swift中的闭包是捕获上下文的匿名函数。每个回调或完成处理器都离不开它们。
// 简单闭包let greeting = { (name: String) in print("Hello, \\(name)!")}greeting("Swift") // Hello, Swift!
// 数组排序let numbers = [3, 1, 7, 2]let sorted = numbers.sorted { $0 < $1 }print(sorted) // [1, 2, 3, 7]刁钻问题: "闭包是引用类型还是值类型?"