如何通过 Swift 面试:常见问题
iOS 开发者职位的面试不仅考察框架知识,还要求对 Swift 语言有深入理解。雇主希望看到候选人能掌握内存管理、并发编程和语法细节。本文整理了面试中经常问到的热门问题,并附有详细解答和代码示例。无论你是初级开发者还是经验丰富的开发者,这篇文章都能帮助你在面试前巩固知识。
1. Swift 基础:类型、可选类型与内存管理
基础问题考察你对语言核心概念的理解程度。我们从最常问的可选类型开始。
问题 1:什么是可选类型?为什么需要它?
答案:可选类型是一种类型安全机制,允许变量要么包含一个值,要么为 nil(表示没有值)。它解决了其他语言中常见的空指针问题。
// 声明一个可选类型var name: String? = "Anna"name = nil // 现在变量不包含任何值
// 安全解包(可选绑定)if let unwrappedName = name { print("你好,\\(unwrappedName)")} else { print("名字为空")}
// 强制解包——危险!// let forcedName = name! // 如果 name == nil 会崩溃问题 2:struct 和 class 有什么区别?
答案:struct 是值类型,而 class 是引用类型。结构体在赋值时会被复制,类则通过引用传递。此外,类支持继承,而结构体不支持。
struct Point { var x: Int var y: Int}
class Person { var name: String init(name: String) { self.name = name }}
var pointA = Point(x: 1, y: 2)var pointB = pointA // 复制pointB.x = 10print(pointA.x) // 1 — 原值不变
var personA = Person(name: "Ivan")var personB = personA // 引用同一个对象personB.name = "Peter"print(personA.name) // "Peter" — 已被修改问题 3:自动引用计数(ARC)是如何工作的?
答案:ARC 自动统计对类对象的强引用数量。当计数归零时,对象会从内存中释放。循环引用(保留环)会导致问题,可通过 weak 或 unowned 引用解决。
class Parent { var child: Child?}
class Child { weak var parent: Parent? // weak 防止循环引用}
var parent: Parent? = Parent()var child: Child? = Child()parent?.child = childchild?.parent = parent2. 高级概念:闭包、协议和泛型
在下一阶段,面试官会考察你是否能使用 Swift 的函数式特性。
问题 4:什么是闭包?它们如何捕获值?
答案:闭包是一段可以被传递和使用的代码块,类似于函数。它会捕获周围上下文中的变量。捕获可以是强引用或弱引用。
func makeIncrementer(incrementAmount: Int) -> () -> Int { var total = 0 let incrementer: () -> Int = { total += incrementAmount // 捕获 total return total } return incrementer}
let incrementByTwo = makeIncrementer(incrementAmount: 2)print(incrementByTwo()) // 2print(incrementByTwo()) // 4问题 5:协议和抽象类有什么区别?
答案:Swift 中没有抽象类。协议定义了一个契约(要求),必须由类、结构体或枚举来实现。