如何通过 Swift 面试:从 A 到 Z 的热门问题

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 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

博客

书籍推荐