引言:为什么 Swift 是成功面试的关键
Swift 面试不仅仅是对语法的考察。Apple 生态系统要求理解语言的基本原理、内存管理和现代框架。在本文中,我们将分析从初级到高级任何级别都会问到的最热门问题。您不仅会学到正确答案,还会了解候选人常犯的典型错误。
本文为教育门户网站 PythonLib 编写,但已针对 Swift 进行了调整。我们整理了材料,以便您可以在面试前快速复习关键主题。
1. Swift 基础:Optional、值类型与引用类型
什么是 Optional,为什么需要它?
Optional 是一个枚举,可以是 .none (nil) 或 .some(Wrapped)。这是 Swift 安全处理缺失值的方式。
var name: String? = "Alice"var age: Int? = nil
// 安全解包if let unwrappedName = name { print("Hello, \\(unwrappedName)")} else { print("Name is nil")}典型错误: 未经检查就使用强制解包 (!)。始终优先使用 guard let 或 if let。
值类型与引用类型
Swift 严格区分类型:
- 值类型(结构体、枚举、基本类型)——赋值时进行复制。
- 引用类型(类)——通过引用传递。
struct Point { var x: Int var y: Int}
class Car { var model: String init(model: String) { self.model = model }}
var point1 = Point(x: 1, y: 2)var point2 = point1point2.x = 5 // point1.x 仍为 1
var car1 = Car(model: "Tesla")var car2 = car1car2.model = "BMW" // car1.model 也会变成 "BMW"面试问题: “为什么 Apple 推荐使用结构体而不是类?” 答案:线程安全、可预测性、无 ARC 开销。
2. 内存管理与 ARC:如何避免内存泄漏
自动引用计数 (ARC) 如何工作?
ARC 自动计算对类对象的引用数。当计数归零时,内存被释放。循环引用会导致问题。
class Person { let name: String var apartment: Apartment? init(name: String) { self.name = name } deinit { print("\\(name) deallocated") }}
class Apartment { let unit: String weak var tenant: Person? // weak — 弱引用 init(unit: String) { self.unit = unit } deinit { print("Apartment \\(unit) deallocated") }}
var john: Person? = Person(name: "John")var unit4A: Apartment? = Apartment(unit: "4A")john?.apartment = unit4Aunit4A?.tenant = johnjohn = nilunit4A = nil// 两个对象都将被释放关键修饰符:
weak— 始终为 optional,释放时自动变为 nil。unowned— 非 optional,假定对象存活(有崩溃风险)。
典型问题: “weak 和 unowned 有什么区别?” 答案:weak 更安全,unowned 更适合必需依赖(例如委托)。
3. 框架:UIKit vs SwiftUI、GCD 和协议
UIKit:ViewController 生命周期和委托模式
理解 viewDidLoad、viewWillAppear、viewDidDisappear 是基础。但面试中常问 委托模式:
protocol MyDelegate: AnyObject { func didTapButton()}
class MyView: UIView { weak var delegate: MyDelegate? @objc func buttonTapped() { delegate?.didTapButton() }}
class MyViewControlle