引言
iOS/macOS 开发者职位的面试不仅仅是测试 UIKit 或 SwiftUI 框架的知识。首先,雇主评估的是你对 Swift 语言的理解:其语法、内存管理特性、多线程和类型系统。即使你能自信地编写应用程序,如果缺乏理论基础,也容易在技术面试中失败。
在这篇文章中,我们整理了 2025 年 Swift 面试中最常被问到的热门问题。每个问题都附有详细解释和代码示例。无论你是初级开发者还是希望巩固知识的有经验开发者,这份资料都会对你有帮助。
1. 可选类型 (Optionals) 与安全性
为什么 Swift 使用可选类型?
Swift 是一门强类型语言,可选类型是其安全处理 nil 的关键特性。与 Objective-C 中 nil 只是一个空指针不同,在 Swift 中,Optional 是一个包含两个 case 的枚举:none (nil) 和 some(Wrapped)。这迫使开发者显式处理值缺失的情况,从而防止崩溃。
如何从可选类型中提取值?
有几种方法:
- 强制解包 — 使用
!运算符。仅当你绝对确定值不为 nil 时使用。 - 可选绑定 — 使用
if let或guard let结构。 - 空合运算符 — 使用
??来提供默认值。
var name: String? = "Alice"
// 强制解包 (危险!)print(name!)
// 可选绑定if let unwrappedName = name { print("Hello, \\(unwrappedName)")}
// 空合运算符let displayName = name ?? "Guest"print(displayName)什么是隐式解包可选类型 (IUO)?
这是一种在访问时会自动解包的可选类型。使用类型后的 ! 声明。主要用于在 init 之后才初始化的属性(例如 UIKit 中的 IBOutlet)。然而,在现代 Swift (5.x) 中,IUO 的行为类似于常规的可选类型,编译器会对风险发出警告。
2. 内存管理:ARC 与强引用循环
ARC 在 Swift 中如何工作?
自动引用计数 (ARC) 是一种引用计数机制。每个类实例都有一个引用计数。当计数降为零时,对象将从内存中释放。ARC 仅适用于引用类型(类、闭包)。值类型(结构体、枚举)存储在栈上,并通过拷贝进行管理。
什么是强引用循环 (retain cycle)?
当两个对象通过强引用相互引用,且 ARC 无法释放它们时,就会形成循环。这会导致内存泄漏。解决方法是使用弱引用 (weak) 或无主引用 (unowned)。
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 = john
john = nilunit4A = nil// 两个对象都将被释放何时使用 weak,何时使用 unowned?
- weak — 始终为可选类型,当对象被释放时会自动变为 nil。当引用的生命周期可能比所有者短时使用。
- unowned — 非可选类型,假定对象的生命周期与所有者相同或更长。有风险:如果对象被释放,访问时