Appearance
01 - Swift 基础全栈深度指南
目录
- Swift 类型系统全栈深度解析
- 变量、常量与数据类型
- 可选类型深度分析
- 函数与闭包
- 枚举与结构体 vs 类
- 协议导向编程(POP)
- 泛型基础
- 内存布局与值类型 vs 引用类型
- 字符串与集合系统
- 运算符与重载
- 错误处理系统
- 可选链与条件绑定
- Swift 并发基础
- Swift vs Kotlin 跨语言对比
- Swift vs Go/Java/Rust 对比
- 面试考点汇总
1. Swift 类型系统全栈深度解析
1.1 Swift 类型系统架构总览
Swift 类型系统完整架构:
┌─────────────────────────────────────────────────────────────────┐
│ 类型系统层级 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ 第一层:原生类型(编译期确定) │
│ │ • 值类型:struct, enum, class (作为值使用时) │
│ │ • 引用类型:class │
│ │ • 协议类型:protocol │
│ │ • 函数类型:(T) -> U │
│ │ • 元组类型:(T1, T2, T3) │
│ └─ │
│ ┌─ 第二层:协议类型(编译期 Witness Table) │
│ │ • Protocol Witness Table (PWT) — 编译期静态绑定 │
│ │ • Type Erasure (Any, Some) │
│ └─ │
│ ┌─ 第三层:泛型类型(编译期特化) │
│ │ • Generic Specialization │
│ │ • Monomorphization(单态化) │
│ └─ │
│ ┌─ 第四层:运行时类型(运行时检查) │
│ │ • Any / AnyObject │
│ │ • Reflection (Mirror) │
│ │ • @objc 动态类型 │
│ └─ │
│ ┌─ 第五层:元数据层(编译器) │
│ │ • Swift Type Metadata │
│ │ • Mangled Name Mangling │
│ └─ │
│ │
└─────────────────────────────────────────────────────────────────┘1.2 类型系统深度剖析
Swift 类型系统的核心特性:
┌─────────────────────────────────────────────────────────────────┐
│ 特性 │ 说明 │ 实现方式 │
├─────────────────────────────────────────────────────────────────┤
│ 编译期类型安全 │ 所有类型在编译期确定 │ 静态类型检查器 │
│ 类型推断 │ let/val 声明时自动推断 │ 编译器类型推导 │
│ 可选类型 │ 通过 Optional enum 实现 │ 编译器语法糖 │
│ 泛型特化 │ 编译器为每个具体类型生成独立代码 │ Monomorphization │
│ 协议 Witness Table│ 编译期绑定,零运行时开销 │ 静态分发 │
│ 值语义 │ struct/enum 默认值拷贝 │ 拷贝构造函数 │
│ 引用语义 │ class 通过 ARC 管理生命周期 │ 引用计数 │
│ 类型擦除 │ 通过擦除具体类型保留行为 │ Any, AnyClass │
│ 桥接 │ Swift ↔ Objective-C 自动桥接 │ 运行时桥接 │
│ 空安全 │ 类型系统区分 null 和非 null │ Optional 类型 │
└─────────────────────────────────────────────────────────────────┘1.3 Swift 类型内存布局
类型内存布局完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 类型 │ 内存布局 │ 大小示例 │
├─────────────────────────────────────────────────────────────────┤
│ Int │ 64-bit 整数值(直接存储) │ 8 bytes │
│ UInt │ 64-bit 无符号整数值 │ 8 bytes │
│ Double │ IEEE 754 64-bit 浮点 │ 8 bytes │
│ Float │ IEEE 754 32-bit 浮点 │ 4 bytes │
│ Bool │ 8-bit 位(true=1, false=0) │ 1 byte │
│ Character │ UTF-32 字符(4 bytes)+ Unicode标量 │ 4 bytes │
│ String │ 指针(8B) + 长度(8B) + capacity(8B) + flags(8B) │ ~32 bytes │
│ Array<T> │ 指针(8B) + count(8B) + capacity(8B) │ ~24 bytes │
│ Dictionary<T,U> │ 哈希表指针 + count(8B) │ ~32 bytes │
│ Optional<T> │ enum (tag + payload) │ 8 bytes │
│ [T]? │ tag(1B) + padding(7B) │ 8 bytes │
│ Closure │ 函数指针 + 捕获变量指针 │ 16-48 bytes │
│ class 实例 │ isa(8B) + refcnt(8B) + 数据区 │ 16+ bytes │
│ struct 实例 │ 直接存储数据(紧凑排列) │ 取决于成员 │
│ 函数类型 │ 函数指针 + 上下文指针 │ 16 bytes │
│ Protocol Witness │ PWT指针(8B) + 类型对象指针(8B) │ 16 bytes │
│ Any │ 类型对象(8B) + 值指针(8B) │ 16 bytes │
└─────────────────────────────────────────────────────────────────┘1.4 类型擦除详解
类型擦除深度分析:
┌─────────────────────────────────────────────────────────────────┐
│ 类型擦除机制: │
│ │
│ 问题: │
│ • 协议是引用类型,不能直接作为返回值/存储 │
│ • 需要保留动态行为但擦除具体类型 │
│ │
│ 擦除方法: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 1. Any — 擦除到任何类型 │ │
│ │ • 不保留协议能力 │ │
│ │ • 需要类型转换 │ │
│ │ • 运行时类型检查开销 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 2. AnyObject — 擦除到任何类 │ │
│ │ • 只适用于 class 类型 │ │
│ │ • 保留类的能力 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 3. 自定义类型擦除包装器 │ │
│ │ • 保留协议的所有能力 │ │
│ │ • 零运行时开销 │ │
│ │ • 编译期类型安全 │ │
│ │ • 推荐方式 ✅ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 自定义类型擦除实现: │
│ protocol NetworkRequestProtocol { │
│ func execute() async throws -> Data │
│ } │
│ │
│ struct AnyNetworkRequest: NetworkRequestProtocol { │
│ private let _execute: () async throws -> Data │
│ func execute() async throws -> Data { │
│ return try await _execute() │
│ } │
│ init<T: NetworkRequestProtocol>(_ wrapped: T) { │
│ _execute = wrapped.execute │
│ } │
│ } │
│ │
│ 优势: │
│ • 保留所有协议方法(包括返回泛型类型的方法) │
│ • 编译期类型安全 │
│ • 运行时零开销(方法分发已静态化) │
│ • 可存储为属性/返回值 │
│ │
│ 对比: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 擦除方式 │ 保留能力 │ 类型安全 │ 运行时开销 │ 推荐度 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Any │ ❌ │ ⚠️ 运行时 │ 高 │ ⭐ │ │
│ │ AnyObject │ ⚠️ 类 │ ⚠️ 运行时 │ 中 │ ⭐⭐ │ │
│ │ 自定义包装 │ ✅ │ ✅ 编译期 │ 零 │ ⭐⭐⭐│ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘2. 变量、常量与数据类型
2.1 Swift 类型系统完整分类
Swift 类型体系:
┌─────────────────────────────────────────────────────────────────┐
│ 类型体系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─ 值类型(Value Types)─ 拷贝创建新实例 │
│ │ • struct(结构体) │
│ │ • enum(枚举) │
│ │ • 元组(Tuple) │
│ │ • 函数类型(Function Types) │
│ └─ │
│ ┌─ 引用类型(Reference Types)─ 共享同一实例 │
│ │ • class(类) │
│ └─ │
│ ┌─ 协议类型(Protocol Types) │
│ │ • 遵循协议的 struct/class/enum │
│ │ • Witness Table 静态分发 │
│ └─ │
│ ┌─ 特殊类型 │
│ │ • Optional<T> — 枚举类型 │
│ │ • Any — 任何类型 │
│ │ • AnyObject — 任何类 │
│ │ • Void — 空元组 () │
│ │ • Never — 永不返回 │
│ └─ │
│ │
└─────────────────────────────────────────────────────────────────┘2.2 基础类型完整解析
Swift 基础类型详细分析:
┌─────────────────────────────────────────────────────────────────┐
│ 类型 │ 位宽 │ 范围 │ 说明 │
├─────────────────────────────────────────────────────────────────┤
│ Bool │ 8-bit │ true/false │ 布尔值 │
│ Int │ 平台相关 │ 2^(n-1) 到 2^(n-1)-1 │ 有符号整数 │
│ UInt │ 平台相关 │ 0 到 2^n-1 │ 无符号整数 │
│ Int8 │ 8-bit │ -128 到 127 │ 固定位宽 │
│ Int16 │ 16-bit │ -32768 到 32767 │ 固定位宽 │
│ Int32 │ 32-bit │ -2147483648 到 ... │ 固定位宽 │
│ Int64 │ 64-bit │ -9.2e18 到 9.2e18 │ 固定位宽 │
│ Float │ 32-bit │ ±1.2e-38 到 ±3.4e38 │ 单精度浮点 │
│ Double │ 64-bit │ ±5e-324 到 ±1.8e308 │ 双精度浮点 │
│ Character │ 32-bit │ 单个 Unicode 字符 │ Unicode │
│ String │ 指针+元数据 │ 可变长度 Unicode 字符串 │ UTF-8 │
│ UInt8 │ 8-bit │ 0 到 255 │ 字节类型 │
│ UInt16 │ 16-bit │ 0 到 65535 │ 固定位宽 │
│ UInt32 │ 32-bit │ 0 到 4294967295 │ 固定位宽 │
│ UInt64 │ 64-bit │ 0 到 1.8e19 │ 固定位宽 │
└─────────────────────────────────────────────────────────────────┘
类型转换完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 转换类型 │ 方法 │ 是否精度丢失 │ 安全性 │
├─────────────────────────────────────────────────────────────────┤
│ Int → Double │ Double(i) │ ❌ 不会 │ ✅ 安全 │
│ Double → Int │ Int(d) │ ✅ 会 │ ⚠️ 需检查 │
│ String → Int │ Int(string) │ ✅ 可能 │ ⚠️ 可选 │
│ Int → String │ String(i) │ ❌ 不会 │ ✅ 安全 │
│ Any → 具体类型 │ as? / as! │ ✅ 可能 │ ⚠️ as? │
│ String → Data │ data(using:) │ ✅ 可能 │ ⚠️ 可选 │
│ Data → String │ String(data:) │ ✅ 可能 │ ⚠️ 可选 │
│ CGFloat → Double │ Double(cg) │ ❌ 不会 │ ✅ 安全 │
│ CGFloat → Float │ Float(cg) │ ✅ 可能 │ ⚠️ 可选 │
└─────────────────────────────────────────────────────────────────┘2.3 代码示例
swift
// 变量与常量
var mutableValue = 42 // var:可变
let immutableValue = "hello" // let:不可变(推荐优先使用)
// 类型别名
typealias Handler = (Int, String) -> Void
typealias CGSize2D = (width: CGFloat, height: CGFloat)
// 数值字面量
let decimal: Int = 42 // 十进制
let binary = 0b1010 // 二进制:10
let octal = 0o52 // 八进制:42
let hex = 0x2A // 十六进制:42
// 数字分隔符(提高可读性)
let million = 1_000_000
let bytesPerKB = 1024_000_000_000
let floatValue = 3.141_592_653_589
// 类型推断
let inferredInt = 42 // Int
let inferredDouble = 3.14 // Double
let inferredString = "test" // String
let inferredArray = [1, 2, 3] // [Int]
// 显式类型声明
let typedInt: Int = 42
let typedDouble: Double = 3.14
let typedArray: [Int] = [1, 2, 3]
// Int 在不同平台的位宽
#if swift(>=5.0)
// 64-bit 平台(iOS):Int = Int64, UInt = UInt64
// 32-bit 平台:Int = Int32, UInt = UInt32
#endif
// 类型转换
let intVal: Int = 42
let doubleVal: Double = Double(intVal) // ✅ 安全
let backToInt = Int(doubleVal) // ⚠️ 精度丢失
let toString = String(intVal) // ✅ 安全
// 类型检查
if value is String { ... } // 类型检查
if let str = value as? String { ... } // 安全转换
let str = value as! String // ⚠️ 强制转换(可能崩溃)
// Any vs AnyObject
let anyValue: Any = 42 // 任何类型
let anyObject: AnyObject = UIView() // 仅类实例
let anyString: Any = "hello" // 也可以3. 可选类型深度分析
3.1 Optional 的底层机制
Optional 的底层实现完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ Optional 的本质: │
│ │
│ enum Optional<Wrapped> where Wrapped: RawRepresentable { │
│ case none │
│ case some(Wrapped) │
│ } │
│ │
│ 内存表示: │
│ • Optional<NSObject>:8 bytes(指针 + tag bit) │
│ • Optional<Int>:8 bytes(Int值本身,tag bit 在高位) │
│ • Optional<Float>:8 bytes(NaN 位被用作 tag) │
│ • Optional<Struct>:取决于 struct 大小,有 tag 开销 │
│ │
│ Swift 编译器优化(Swift 4+): │
│ • 整型 Optional:直接复用整数值的高位作为 tag │
│ • 指针 Optional:使用低位作为 tag (Tagged Pointers) │
│ • Float Optional:使用 NaN 的 quiet bit 作为 tag │
│ • 这意味着大部分 Optional 没有额外的内存开销! │
│ │
│ 内存优化对比: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 类型 │ 有 tag 优化 │ 无 tag 优化 │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ Optional<Int> │ 8 bytes │ 16 bytes (enum 开销) │
│ │ Optional<UInt> │ 8 bytes │ 16 bytes │
│ │ Optional<Float> │ 8 bytes │ 16 bytes │
│ │ Optional<Bool> │ 1 byte │ 1 byte │
│ │ Optional<NSObject> │ 8 bytes │ 8 bytes (指针+tag) │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘3.2 可选绑定与解包完整对比
可选解包方式完整对比:
┌─────────────────────────────────────────────────────────────────┐
│ 方式 │ 语法 │ 安全性 │ 性能 │ 适用场景 │
├─────────────────────────────────────────────────────────────────┤
│ if let │ if let v = x { │ ✅ │ O(1) │ 单次条件处理 │
│ guard let │ guard let v = x else { │ ✅ │ O(1) │ 早期退出模式 │
│ 强制解包 │ x! │ ❌ │ O(1) │ 绝对非 nil 时 │
│ 可选链 │ x?.property │ ✅ │ O(1) │ 链式调用 │
│ nil coalescing │ x ?? default │ ✅ │ O(1) │ 默认值 │
│ implicitly unwrapped │ String! │ ⚠️ │ O(1) │ Storyboard Outlet │
│ 多值绑定 │ if let a = x, │ ✅ │ O(1) │ 多可选值同时 │
│ │ let b = y { │ │ │ 绑定 │
│ guard 多值 │ guard let a, │ ✅ │ O(1) │ 多值守卫 │
│ │ let b else { │ │ │ │
└─────────────────────────────────────────────────────────────────┘
nil 传播(Nil Propagation)完整示例:
// 可选链的链式传播
let result = user?.address?.city?.name // String?
// 任何一步为 nil → 整体为 nil
// nil coalescing 的嵌套使用
let name = user?.name ?? "Anonymous"
let age = user?.age ?? 0
let city = user?.address?.city ?? "Unknown"
// 可选映射
let upperName = user?.name?.uppercased() // String?
let count = items?.count ?? 0
// try-catch 与可选
func fetchData() throws -> Data? { ... }
// guard let 的多个条件
func process(data: Data?) {
guard let json = try? JSONSerialization.jsonObject(with: data!) as? [String: Any]
else { return }
guard let name = json["name"] as? String
else { return }
// 安全使用 name
}3.3 可选类型进阶
可选类型的高级用法:
// Optional 的模式匹配
if case .some(let value) = optionalValue {
// 等价于 if let value = optionalValue
}
// Optional 作为 switch case
switch optionalValue {
case .none:
print("无值")
case .some(let value):
print("有值: \(value)")
}
// Optional 的布尔转换
if optionalValue {
// 当 Optional 是 Bool 类型时,可以直接转换
}
// Optional 的 map 和 flatMap
let result = optionalValue.map { $0.uppercased() } // 有值时转换
let flatResult = stringArray.flatMap { $0.first } // 返回 [T]?
// Optional 的 reduce
let sum = optionalArray?.reduce(0, +)
// Optional 的压缩
func compressOptionals<A, B, C, D, E, F>(
_ a: A?, _ b: B?, _ c: C?, _ d: D?, _ e: E?, _ f: F?
) -> ((A, B, C, D, E, F) -> Void)? {
guard let a = a, let b = b, let c = c, let d = d, let e = e, let f = f else {
return nil
}
return { $0, $1, $2, $3, $4, $5 }
}4. 函数与闭包
4.1 函数系统完整分析
Swift 函数系统架构:
┌─────────────────────────────────────────────────────────────────┐
│ 函数分类: │
│ │
│ ┌─ 自由函数(Free Functions) │
│ │ func greet(name: String) -> String { ... } │
│ │ • 不属于任何类型 │
│ │ • 静态分发 │
│ │ • 零运行时开销 │
│ └─ │
│ ┌─ 实例方法(Instance Methods) │
│ │ func doSomething() { ... } │
│ │ • 隐式接收 self 作为 first 参数 │
│ │ • 非 @objc:Witness Table 静态分发 │
│ │ • @objc:Objective-C 运行时动态分发 │
│ └─ │
│ ┌─ 类型方法(Type Methods) │
│ │ class func doSomething() { ... } │
│ │ static func doSomething() { ... } │
│ │ • 类级别的方法 │
│ │ • 不需要实例 │
│ └─ │
│ ┌─ 可变方法(mutating) │
│ │ mutating func increment() { ... } │
│ │ • 可以修改 self │
│ │ • 仅 struct/enum 方法可用 │
│ └─ │
│ ┌─ 泛型函数 │
│ │ func first<T>(items: [T]) -> T? { ... } │
│ │ • 编译期特化 │
│ │ • 零运行时开销 │
│ └─ │
│ ┌─ 构造函数(Initializers) │
│ │ convenience init() // 委托到其他构造函数 │
│ │ required init() // 子类必须实现 │
│ │ deinit () // 析构函数 │
│ │ required init?(coder:) // 必须实现 │
│ └─ │
│ │
└─────────────────────────────────────────────────────────────────┘4.2 参数命名模式完整分析
Swift 参数命名完整模式:
// 模式 1:仅内部名(第一个参数省略外部名)
func greet(name: String) { ... }
greet(name: "John") // 调用时省略第一个参数的外部名
// 模式 2:外部名 = 内部名
func greet(from city: String) { ... }
greet(from: "Beijing")
// 模式 3:外部名 ≠ 内部名
func greet(_ name: String, from city: String) { ... }
// 第一个参数调用时省略外部名
// 第二个参数保留外部名
greet("John", from: "Beijing")
// 模式 4:仅内部名(_ 前缀)
func process(_ data: Data, with handler: Handler) { ... }
// data 在调用时省略外部名
// handler 在调用时必须提供外部名
process(data, with: handler)
// 模式 5:默认参数(必须在最后)
func fetch(_ url: String, timeout: Int = 30, retries: Int = 3) { ... }
fetch("https://api.example.com") // 使用默认值
fetch("https://api.example.com", timeout: 60)
// 参数顺序规则:
// 1. 无默认值参数在前
// 2. 有默认值参数在后
// 3. _ 参数(省略外部名)在前
// 4. 可变参数必须在最后
func example(_ a: Int, b: Int, _ c: String = "default", d: String...) { ... }4.3 闭包系统完整分析
闭包系统完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 闭包类型: │
│ • 全局函数:有名称,不捕获任何值 │
│ • 嵌套函数:有名称,捕获外层函数中的值 │
│ • 闭包表达式:无名称,捕获周围上下文中的值 │
│ │
│ 闭包捕获列表完整分析: │
│ │
│ ┌─ [weak self] — 弱引用(最常用) │
│ │ • self 在闭包内变为 Optional │
│ │ • 需要 guard let/unwrapped self │
│ │ • 打破循环引用的首选方式 │
│ │ • 推荐 ✅ │
│ └─ │
│ ┌─ [unowned self] — 无主引用 │
│ │ • self 在闭包内仍为非 Optional │
│ │ • 不打破循环引用 │
│ │ • self 被释放后访问 → 崩溃 │
│ │ • 确保闭包在 self 生命周期内执行时使用 │
│ │ • 场景:父→子委托(子不会持有父的强引用) │
│ └─ │
│ ┌─ [weak delegate] — 多个弱引用 │
│ │ [weak self, weak delegate] in │
│ │ guard let self = self else { return } │
│ │ delegate?.onComplete(self.result) │
│ └─ │
│ ┌─ [unowned(safeObject)] — 安全的无主引用 │
│ │ • safeObject 保证不会为 nil │
│ │ • 但仍然不打破循环引用 │
│ └─ │
│ │
│ 闭包逃逸分析: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 场景 │ @escaping │ 内存分配 │ 推荐度 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 同步执行闭包 │ ❌ 不需要 │ 栈分配 │ ✅ │ │
│ │ 异步回调 │ ✅ 需要 │ 堆分配 │ ✅ │ │
│ │ 存储为属性 │ ✅ 需要 │ 堆分配 │ ✅ │ │
│ │ 作为返回值 │ ✅ 需要 │ 堆分配 │ ✅ │ │
│ │ 传递到后台线程 │ ✅ 需要 │ 堆分配 │ ✅ │ │
│ │ 闭包内调用闭包 │ ❌ 不需要 │ 栈分配 │ ✅ │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 闭包性能分析: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 类型 │ 内存分配 │ 开销 │ 适用场景 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 栈分配闭包 │ O(0) │ 零 │ 同步函数、一次性处理 │ │
│ │ 堆分配闭包 │ O(1) │ 小 │ @escaping 闭包 │ │
│ │ 全局函数 │ O(0) │ 零 │ 复用性高的函数 │ │
│ │ 尾随闭包 │ O(0) │ 零 │ 流畅 API 风格 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 闭包 vs 函数性能对比: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 维度 │ 闭包 │ 函数 │ 结论 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 首次调用 │ 极小开销 │ 零开销 │ 函数略优 │ │
│ │ 缓存后的调用 │ 接近零开销 │ 零开销 │ 几乎相同 │ │
│ │ 捕获变量 │ 需要额外内存 │ 不适用 │ 闭包开销 │ │
│ │ 编译期优化 │ 内联优化 │ 内联优化 │ 相同 │ │
│ │ 代码复用 │ 较低 │ 较高 │ 函数优势 │ │
│ │ 类型安全 │ ✅ 编译期 │ ✅ 编译期 │ 相同 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘4.4 闭包完整代码示例
swift
// 基础闭包
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { (n: Int) -> Int in
return n * 2
}
// 尾随闭包
let filtered = numbers.filter { $0 > 2 }
// 逃逸闭包
var completionHandlers: [(Int) -> Void] = []
func fetchData(completion: @escaping (Data) -> Void) {
someAsyncTask { data in
completion(data) // 在函数返回后调用
}
completionHandlers.append(completion)
}
// 非逃逸闭包
func syncProcess(data: Data, completion: (Data) -> Void) {
let result = data.process()
completion(result) // 在返回前调用,无需 @escaping
}
// 捕获列表完整示例
class ViewController: UIViewController {
var timer: Timer?
func startTimer() {
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] _ in
guard let self = self else { return }
self.updateTimestamp()
}
}
func stopTimer() {
timer?.invalidate()
timer = nil
}
}
// 多重捕获
func setupObserver() {
let delegate = self.delegate
let model = self.model
NotificationCenter.default.addObserver(
forName: .DataUpdated,
object: nil,
queue: .main
) { [weak self, weak delegate] notification in
guard let self = self else { return }
delegate?.onDataUpdated(self.processedData)
}
}5. 枚举与结构体 vs 类
5.1 枚举完整深度分析
Swift 枚举系统完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 枚举类型: │
│ • 基本枚举:case 枚举值 │
│ • 关联值枚举:case 携带值 │
│ • 原始值枚举:enum Type: RawType { case x = rawValue } │
│ • 递归枚举:indirect enum { case leaf, case node(...) } │
│ • 泛型枚举:enum Result<T, E> { case success(T), failure(E) } │
│ • 协议枚举:enum 遵循协议 │
│ │
│ 枚举内存布局: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 枚举类型 │ 内存大小 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ enum Direction { │ │
│ │ case north, south, east, west │ │
│ │ } │ │
│ │ 内存:8 bytes (tag + padding) │ │
│ │ │ │
│ │ enum Result { │ │
│ │ case success(String) │ │
│ │ case failure(Error) │ │
│ │ } │ │
│ │ 内存:max(tag+String, tag+Error) = ~40 bytes │ │
│ │ │ │
│ │ enum Status: Int { │ │
│ │ case loading, success, error │ │
│ │ } │ │
│ │ 内存:8 bytes (Int rawValue) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 枚举作为错误类型(Error Protocol): │
│ enum APIError: Error { │
│ case network(Error) │
│ case decodeFailed(String) │
│ case invalidResponse(Int) │
│ case timeout │
│ case unauthorized │
│ case notFound(String) │
│ } │
│ │
│ 枚举符合的协议: │
│ • Hashable(自动) │
│ • Equatable(自动) │
│ • Codable(所有关联值 Codable) │
│ • Sendable(所有关联值 Sendable) │
│ • CustomStringConvertible(可自定义) │
│ • CaseIterable(可枚举所有值) │
│ │
│ 枚举的高级特性: │
│ • RawRepresentable:rawValue / init(rawValue:) │
│ • CaseIterable:allCases / 范围 │
│ • Hashable:自动计算哈希值 │
│ • Codable:自动编解码 │
│ • Equatable:值比较 │
│ • Sendable:线程安全(Swift 5.5+) │
└─────────────────────────────────────────────────────────────────┘5.2 结构体 vs 类深度对比
结构体与类的完整对比:
┌─────────────────────────────────────────────────────────────────┐
│ 特性 │ 结构体(struct) │ 类(class) │
├─────────────────────────────────────────────────────────────────┤
│ 内存分配 │ 栈(Stack) │ 堆(Heap) │
│ 拷贝方式 │ 值拷贝(深拷贝) │ 引用拷贝(浅拷贝) │
│ 继承 │ ❌ 不支持 │ ✅ 支持(单一继承) │
│ 析构函数 │ ❌ 不支持 │ ✅ deinit │
│ 类型转换 │ ❌ 不支持 │ ✅ is/as │
│ ARC 管理 │ ❌ 不需要 │ ✅ 需要 │
│ 性能 │ ✅ 零开销 │ ⚠️ ARC 开销 │
│ 线程安全 │ ✅ 天然线程安全 │ ❌ 需要额外处理 │
│ 内存布局 │ 紧凑(数据连续) │ 分散(堆+控制块) │
│ 内存碎片 │ 无 │ 有 │
│ GC 压力 │ 无 │ 低(ARC 非 GC) │
│ 适用场景 │ 数据模型、值类型 │ UI组件、单例、共享状态 │
│ 协议遵循 │ ✅ 遵循 │ ✅ 遵循 │
│ 扩展 │ ✅ 可以 │ ✅ 可以 │
│ 泛型约束 │ ✅ 可以 │ ✅ 可以 │
│ 多协议遵循 │ ✅ 可以 │ ✅ 可以 │
│ 可 mutating 方法 │ ✅ 可以 │ ❌ 不适用 │
│ 延迟初始化 │ ❌ 不支持 │ ✅ lazy var │
│ 自定义初始化器 │ ✅ 支持 │ ✅ 支持 │
│ 便利初始化器 │ ❌ 不支持 │ ✅ convenience │
│ 必要初始化器 │ ❌ 不支持 │ ✅ required │
│ 可选属性 │ ✅ 支持 │ ✅ 支持 │
│ 计算属性 │ ✅ 支持 │ ✅ 支持 │
│ 下标 │ ✅ 支持 │ ✅ 支持 │
│ 嵌套类型 │ ✅ 支持 │ ✅ 支持 │
│ 关联对象 │ ✅ @objc 支持 │ ✅ 不需要 │
│ 运行时类型信息 │ ✅ Mirror │ ✅ Mirror │
│ 元数据开销 │ 无 │ isa 指针 + refcnt │
│ 初始化开销 │ O(1) │ O(n)(ARC) │
│ 内存访问 │ 直接 │ 间接(指针解引用) │
│ 缓存友好 │ 好(连续内存) │ 差(分散内存) │
│ 适用 Swift 设计原则 │ 默认选择 │ 需要时选用 │
└─────────────────────────────────────────────────────────────────┘
内存布局详细分析:
┌─────────────────────────────────────────────────────────────────┐
│ 结构体内存布局示例: │
│ struct Point { │
│ var x: Double = 0.0 // 8 bytes │
│ var y: Double = 0.0 // 8 bytes │
│ } │
│ Total: 16 bytes(紧凑排列,无 padding) │
│ │
│ class 内存布局示例: │
│ class Point: NSObject { │
│ var x: Double = 0.0 // 8 bytes │
│ var y: Double = 0.0 // 8 bytes │
│ } │
│ Total: 16 bytes(数据)+ 16 bytes(isa + refcnt)= 32 bytes │
│ │
│ 性能对比(拷贝 1000 万次): │
│ struct 拷贝: ~0.05 seconds (栈分配,直接 memcpy) │
│ class 引用: ~0.02 seconds (指针拷贝) │
│ class retain/release: ~0.15 seconds (每个拷贝 2 次原子操作) │
│ │
│ 结论:结构体在性能上优于 class(拷贝快 + 无 ARC 开销) │
└─────────────────────────────────────────────────────────────────┘6. 协议导向编程(POP)
6.1 POP 完整深度分析
协议导向编程(POP)深度分析:
┌─────────────────────────────────────────────────────────────────┐
│ POP(Protocol-Oriented Programming)核心原理: │
│ │
│ 核心思想: │
│ • 用协议定义行为 │
│ • 用值类型(struct)实现行为 │
│ • 通过协议扩展提供默认实现 │
│ • 多态通过协议实现,而非继承 │
│ │
│ POP vs OOP 全面对比: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 维度 │ OOP │ POP │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 多态基础 │ 继承 │ 协议遵循 │ │
│ │ 代码复用 │ 继承链 │ 协议扩展 │ │
│ │ 编译期/运行 │ 运行时 │ 编译期 │ │
│ │ 内存管理 │ 引用计数 │ 值拷贝/栈 │ │
│ │ 扩展性 │ 单一继承限制 │ 多协议遵循 │ │
│ │ 组合 │ 继承树 │ 协议组合 │ │
│ │ 测试 │ 需要 Mock 框架 │ 简单 Mock │ │
│ │ 性能 │ 虚表查找(运行时) │ Witness Table(编译期)│ │
│ │ 安全性 │ 运行时检查 │ 编译期检查 │ │
│ │ 解耦度 │ 低(紧耦合) │ 高(松耦合) │ │
│ │ 可测试性 │ 一般 │ 高 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 协议扩展(Protocol Extension): │
│ • 提供默认实现 │
│ • 添加计算属性 │
│ • 添加协议方法 │
│ • 提供符合特定协议的泛型方法 │
│ • 注意:不能添加存储属性(可以用关联对象@objc) │
│ • 注意:扩展方法的默认实现可以用 mutating │
│ • 注意:扩展中的存储属性使用关联对象存储在堆上 │
│ │
│ Witness Table 深度分析: │
│ • 编译期为每个类型生成 Witness Table │
│ • 包含该类型遵循的所有协议方法实现 │
│ • 运行时通过 Witness Table 查找方法 │
│ • 零运行时开销(静态分发) │
│ • @objc 协议使用 Objective-C 运行时 │
│ • Witness Table 在编译期确定,运行时直接查找 │
└─────────────────────────────────────────────────────────────────┘6.2 协议相关完整代码示例
swift
// 协议定义
protocol NetworkService {
var baseURL: String { get }
func get(endpoint: String) async throws -> Data
func post(endpoint: String, body: Data) async throws -> Data
}
// 协议扩展提供默认实现
extension NetworkService {
var defaultHeaders: [String: String] {
return ["Content-Type": "application/json", "Accept": "application/json"]
}
func request(endpoint: String, method: String, body: Data?) async throws -> Data {
var request = URLRequest(url: URL(string: baseURL + endpoint)!)
request.httpMethod = method
request.httpBody = body
request.allHTTPHeaderFields = defaultHeaders
let (data, _) = try await URLSession.shared.data(for: request)
return data
}
}
// 具体实现
struct API: NetworkService {
let baseURL: String = "https://api.example.com"
let authToken: String
func get(endpoint: String) async throws -> Data {
return try await request(endpoint: endpoint, method: "GET", body: nil)
}
func post(endpoint: String, body: Data) async throws -> Data {
return try await request(endpoint: endpoint, method: "POST", body: body)
}
}
// 协议组合
func processItems<T: Collection>(items: T) -> [T.Element: Int] {
where T.Element: Hashable
{
var counts: [T.Element: Int] = [:]
for item in items {
counts[item, default: 0] += 1
}
return counts
}
// 条件遵循
extension Optional: Identifiable where Wrapped: Identifiable {
var identifier: String? {
return self?.identifier
}
}
// 协议遵循
protocol Serializable {
func serialize() -> Data
init?(deserialize: Data)
}
struct User: Codable, Hashable, Identifiable, Serializable {
let id: UUID
let name: String
let email: String
func serialize() -> Data {
return try! JSONEncoder().encode(self)
}
init?(deserialize: Data) {
guard let user = try? JSONDecoder().decode(User.self, from: deserialize) else {
return nil
}
self = user
}
}7. 泛型基础
7.1 泛型系统完整分析
Swift 泛型系统完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 泛型特性: │
│ • 编译期特化(Monomorphization) │
│ • 泛型约束(Generic Constraints) │
│ • 关联类型(Associated Types) │
│ • where 子句 │
│ • 泛型特化(编译器为每个具体类型生成独立代码) │
│ • 泛型擦除(Type Erasure) │
│ • 泛型协议(Protocol with Associated Types) │
│ │
│ 泛型约束类型: │
│ • Equatable — 可比较 │
│ • Comparable — 可排序 │
│ • Hashable — 可哈希 │
│ • Codable — 可编解码 │
│ • Sendable — 线程安全(Swift 5.5+) │
│ • AnyObject — 必须是 class │
│ • NSObject — 必须是 NSObject 子类 │
│ • AnyObject & Codable — 类 + Codable │
│ • Collection — 集合协议 │
│ • Sequence — 序列协议 │
│ • RangeReplaceableCollection — 范围替换集合 │
│ • MutableCollection — 可修改集合 │
│ • Strideable — 可步进 │
│ • LosslessStringConvertible — 字符串转换 │
│ • BinaryInteger — 二进制整数 │
│ • SignedInteger — 有符号整数 │
│ • UnsignedInteger — 无符号整数 │
│ • FloatingPoint — 浮点数 │
│ • CustomStringConvertible — 字符串描述 │
│ • ExpressibleByLiteral — 字面量可表达 │
└─────────────────────────────────────────────────────────────────┘7.2 泛型完整代码示例
swift
// 泛型函数
func first<T>(items: [T]) -> T? { items.first }
func last<T>(items: [T]) -> T? { items.last }
func contains<T: Equatable>(items: [T], target: T) -> Bool { items.contains(target) }
func findIndex<T: Equatable>(of target: T, in items: [T]) -> Int? { items.firstIndex(of: target) }
// 泛型类型
struct Stack<T> {
private var elements: [T] = []
var count: Int { elements.count }
var isEmpty: Bool { elements.isEmpty }
mutating func push(_ item: T) { elements.append(item) }
mutating func pop() -> T? { elements.popLast() }
func peek() -> T? { elements.last }
}
// 泛型约束 + where
func swap<T: Comparable>(_ a: inout T, _ b: inout T) {
if a < b { swap(&a, &b) }
}
// where 子句
func process<T: Collection>(items: T) -> [T.Element: Int]
where T.Element: Hashable
{
var counts: [T.Element: Int] = [:]
for item in items {
counts[item, default: 0] += 1
}
return counts
}
// 关联类型
protocol Container {
associatedtype Item
associatedtype Index: Comparable
var count: Int { get }
subscript(index: Index) -> Item { get }
}
struct IntStack: Container {
typealias Item = Int
typealias Index = Int
var items: [Int] = []
var count: Int { items.count }
subscript(index: Index) -> Int { items[index] }
}
// 泛型枚举
enum Result<Success, Failure: Error> {
case success(Success)
case failure(Failure)
var value: Success? {
if case .success(let v) = self { return v }
return nil
}
var error: Failure? {
if case .failure(let e) = self { return e }
return nil
}
}
// 泛型特化性能
func sort<T: Comparable>(_ items: [T]) -> [T] {
return items.sorted()
}
// 编译器为 Array<Int>、Array<String> 等分别生成特化代码
// 零运行时泛型开销8. 内存布局与值类型 vs 引用类型
8.1 Swift 内存模型完整分析
Swift 内存模型完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 内存区域: │
│ │
│ ┌─ Stack(栈) │
│ │ • 局部变量(值类型) │
│ │ • 函数参数 │
│ │ • 返回地址 │
│ │ • 自动释放池(autoreleasepool) │
│ │ • 线程局部存储(TLS) │
│ │ • 增长方向:高地址 → 低地址 │
│ │ • 分配/释放:指针加减(极快) │
│ │ • 生命周期:函数退出时自动释放 │
│ └─ │
│ │
│ ┌─ Heap(堆) │
│ │ • 引用类型(class)实例 │
│ │ • 逃逸闭包 │
│ │ • 动态分配(Array/Dictionary 扩容) │
│ │ • 关联对象 │
│ │ • ARC 管理 │
│ │ • 增长方向:低地址 → 高地址 │
│ │ • 分配/释放:堆分配器(慢) │
│ │ • 生命周期:引用计数归零时释放 │
│ └─ │
│ │
│ ┌─ __TEXT 段(代码段) │
│ │ • 可执行代码 │
│ │ • 常量 │
│ │ • 常量字符串 │
│ └─ │
│ │
│ ┌─ __DATA 段(数据段) │
│ │ • 静态/全局变量 │
│ │ • GOT/PLT │
│ │ • 未初始化的全局变量(BSS) │
│ └─ │
│ │
└─────────────────────────────────────────────────────────────────┘8.2 ARC 完整深度分析
ARC(Automatic Reference Counting)完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ ARC 核心机制: │
│ • 编译器自动插入 retain/release │
│ • retain:引用计数 +1 │
│ • release:引用计数 -1 │
│ • retainCount == 0:释放对象 + 调用 deinit │
│ • deinit:对象被释放时调用(清理资源) │
│ │
│ 强引用 vs 弱引用 vs 无主引用: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 类型 │ 引用计数 │ 置 nil │ 安全等级 │ 适用场景 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ strong(默认)│ 增加 │ 否 │ ⭐⭐⭐⭐ │ 默认选择 │ │
│ │ weak │ 不增加 │ 是 │ ⭐⭐⭐⭐ │ delegate │ │
│ │ unowned │ 不增加 │ 否 │ ⭐⭐⭐ │ 父→子委托 │ │
│ │ unsafe │ 不检查 │ 否 │ ⭐ │ C 互操作 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 循环引用检测与解决方案: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 场景 │ 问题 │ 解决方案 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ delegate │ 父→子→父循环 │ weak delegate │ │
│ │ 闭包捕获 self │ 闭包→self循环 │ [weak self] │ │
│ │ KVO │ 移除不及时 │ 及时 removeObserver │ │
│ │ NSTimer │ Timer 强引用 │ invalidate │ │
│ │ CADisplayLink │ 未 invalidate │ viewWillDisappear │ │
│ │ NotificationCenter │ 未移除 Observer │ deinit 中移除 │ │
│ │ parent→child │ 父→子循环 │ unowned child │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ ARC 性能分析: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 操作 │ 复杂度 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ retain │ O(1) │ 原子操作 +1 │ │
│ │ release │ O(1) │ 原子操作 -1 │ │
│ │ 内存分配 │ O(n) │ 堆分配器 │ │
│ │ deinit │ O(n) │ 清理资源 │ │
│ │ 内存释放 │ O(n) │ 堆释放 │ │
│ │ 循环检测 │ O(n²) │ 仅在 weak 引用时检测 │ │
│ │ 桥接 │ O(0) │ Swift ↔ ObjC 桥接(零开销) │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘9. 字符串与集合系统
9.1 Swift 字符串完整分析
Swift 字符串完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ Swift 字符串底层实现: │
│ • Swift String 使用 UTF-8 编码 │
│ • 内存布局:指针(8B) + 长度(8B) + capacity(8B) + flags(8B) │
│ • 小字符串优化(SSO):≤ 15 字符存储在字符串内部 │
│ • 大字符串:堆分配存储 │
│ • Unicode 感知:字符是 Unicode 标量序列 │
│ • 索引:String.Index 对应 Unicode 标量的位置 │
│ │
│ 字符串操作复杂度: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 操作 │ 复杂度 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 访问字符 │ O(1) │ count(非直接索引) │ │
│ │ 追加 │ O(1) │ append(均摊) │ │
│ │ 插入 │ O(n) │ insert │ │
│ │ 删除 │ O(n) │ remove │ │
│ │ 查找 │ O(n) │ contains │ │
│ │ 子字符串 │ O(k) │ substring │ │
│ │ 分割 │ O(n) │ split │ │
│ │ 连接 │ O(n+m) │ + │ │
│ │ 编码 │ O(n) │ data(using:) │ │
│ │ 解码 │ O(n) │ init(data:) │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 字符串优化建议: │
│ • 使用 + 连接字符串(Swift 5+ 优化为 O(n+m)) │
│ • 大量字符串拼接使用 NSMutableString 或 StringBuilder │
│ • 使用 String.Index 而非 Int 索引 │
│ • 使用 .count 而非 .utf8.count / .utf16.count │
│ • 使用 .prefix(.suffix 而非索引 │
│ • 使用 .hasPrefix/.hasSuffix 进行前缀/后缀检查 │
└─────────────────────────────────────────────────────────────────┘10. 运算符与重载
10.1 Swift 运算符完整分析
Swift 运算符完整分类:
┌─────────────────────────────────────────────────────────────────┐
│ 运算符类型: │
│ • 一元运算符:前缀(-x)、后缀(x!) │
│ • 二元运算符:(x + y, x == y) │
│ • 三元运算符:(a ? b : c) │
│ • 范围运算符:(1..<10, 1...10, 1...) │
│ • 空合运算符:(a ?? b) │
│ • 可选链运算符:(a?.b) │
│ • 闭包运算符:({ $0 + $1 }) │
│ │
│ 运算符重载: │
│ • 可以为自定义类型定义运算符行为 │
│ • 运算符优先级和结合性:PrecedenceGroup 定义 │
│ • 运算符必须声明为静态方法 │
│ • 运算符可以重载所有内置运算符 │
│ • 自定义运算符使用 infix/prefix/suffix │
└─────────────────────────────────────────────────────────────────┘11. 错误处理系统
11.1 Swift 错误处理完整分析
Swift 错误处理系统完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 错误处理机制: │
│ • Error 协议 │
│ • throw / throws / do-catch │
│ • try / try? / try! │
│ • defer │
│ • CustomNSError │
│ • NS_SWIFT_ERRROR │
│ │
│ 错误处理策略对比: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 方式 │ 安全性 │ 代码风格 │ 适用场景 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ do-catch │ ✅ │ 冗长 │ 需要精细处理错误 │ │
│ │ try? │ ✅ │ 简洁 │ 忽略错误细节 │ │
│ │ try! │ ❌ │ 最简洁 │ 确定不失败 │ │
│ │ 返回 Result │ ✅ │ 函数式 │ 返回值 + 错误 │ │
│ │ 可选返回 │ ✅ │ 简洁 │ 简单错误场景 │ │
│ │ fatalError │ ❌ │ 最简洁 │ 开发阶段 │ │
│ │ precondition │ ❌ │ 断言 │ 开发检查 │ │
│ └─────────────────────────────────────────────────────────────┘ │
│ │
│ 自定义错误类型: │
│ enum APIError: Error { │
│ case invalidURL │
│ case network(Error) │
│ case decodeFailed(String) │
│ case server(Int, String) │
│ case unauthorized │
│ case timeout │
│ } │
│ │
│ CustomNSError 集成: │
│ enum CustomError: Error, CustomNSError { │
│ case notFound │
│ case permissionDenied │
│ var errorCode: Int { │
│ switch self { │
│ case .notFound: return 404 │
│ case .permissionDenied: return 403 │
│ } │
│ } │
│ var errorDomain: String { "com.example.error" } │
│ var errorUserInfo: [String: Any] { │
│ switch self { │
│ case .notFound: return [NSLocalizedDescriptionKey: "Not Found"] │
│ case .permissionDenied: return [NSLocalizedDescriptionKey: "Permission Denied"] │
│ } │
│ } │
│ } │
└─────────────────────────────────────────────────────────────────┘12. 可选链与条件绑定
12.1 可选链完整分析
可选链完整分析:
┌─────────────────────────────────────────────────────────────────┐
│ 可选链机制: │
│ • ?. — 可选成员访问 │
│ • ?[ — 可选下标访问 │
│ • ?() — 可选方法调用 │
│ • ?.subscript?.property — 链式可选 │
│ │
│ 可选链的返回值类型: │
│ • 原类型 T → 返回 T? │
│ • 如果任何一步为 nil → 整体返回 nil │
│ • 如果链中某步返回 nil → 后续步骤不执行 │
│ │
│ 可选链性能分析: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 操作 │ 复杂度 │ 说明 │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 可选成员访问 │ O(1) │ 单次可选访问 │ │
│ │ 链式可选 │ O(n) │ n 步可选链 │ │
│ │ 可选下标访问 │ O(1) │ 单次可选访问 │ │
│ │ 可选方法调用 │ O(1) │ 单次可选调用 │ │
│ │ nil 传播 │ O(1) │ 任何 nil 立即短路 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘13. Swift 并发基础
13.1 Swift 并发完整分析
Swift 并发系统基础:
┌─────────────────────────────────────────────────────────────────┐
│ 并发基础: │
│ • async/await — 异步函数声明 │
│ • Task — 轻量级并发任务 │
│ • TaskGroup — 任务组(不确定数量) │
│ • actor — 线程安全的状态容器 │
│ • @Sendable — 线程安全的闭包 │
│ • MainActor — 主线程执行 │
│ • @escaping — 逃逸闭包 │
│ │
│ 并发模型对比: │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ 特性 │ GCD │ Swift Concurrency │ │
│ ├─────────────────────────────────────────────────────────────┤ │
│ │ 编程模型 │ 回调/闭包 │ async/await │ │
│ │ 线程管理 │ DispatchQueue │ Task 调度器 │ │
│ │ 结构化并发 │ 无 │ ✅ │ │
│ │ 数据竞争 │ 手动管理 │ Actor 隔离 │ │
│ │ 取消支持 │ Cancellation │ Task.cancel() │ │
│ │ 错误处理 │ Result │ throws │ │
│ │ 性能开销 │ 中 │ 低 │ │
│ │ 推荐度 │ 老旧但成熟 │ ✅ 推荐 │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘14. Swift vs Kotlin 跨语言对比
14.1 核心概念对比
Swift vs Kotlin 全面对比:
┌─────────────────────────────────────────────────────────────────┐
│ 概念 │ Swift │ Kotlin │
├─────────────────────────────────────────────────────────────────┤
│ 常量 │ let │ val │
│ 变量 │ var │ var │
│ 函数 │ func │ fun │
│ 类 │ class │ class │
│ 结构体 │ struct │ data class / class │
│ 枚举 │ enum │ enum │
│ 协议 │ protocol │ interface │
│ 可选类型 │ Optional<T> │ T? │
│ 空安全 │ Optional/nil coalescing │ null safety / ?: │
│ 扩展 │ extension │ extension function │
│ 泛型 │ generic type parameter │ generic type param │
│ 闭包 │ closure { } │ lambda { } │
│ 字符串插值 │ "\(variable)" │ "$variable" │
│ 模式匹配 │ switch/if-let/guard-let │ when/if │
│ 委托 │ delegation(协议扩展) │ by 关键字 │
│ 协程 │ async/await │ coroutine │
│ 类型推断 │ let/val 自动推断 │ val/var 自动推断 │
│ Any/AnyObject │ Any / AnyObject(类) │ Any / Any? │
│ 密封类 │ enum(替代) │ sealed class │
│ 泛型约束 │ <T: Equatable> │ where T: Equatable │
│ 元组 │ (T1, T2) │ 无(用 data class 替代)│
│ 尾随闭包 │ 支持 │ 支持 │
│ 属性代理 │ 不支持 │ by lazy/delegate │
│ 数据类 │ struct 支持 │ data class 支持 │
│ 解构 │ let (a, b) = tuple │ val (a, b) = pair │
│ 高阶函数 │ map/filter/reduce │ map/filter/reduce │
│ 内联函数 │ @inline(_always) │ inline │
│ 内省 │ Mirror │ reflection │
│ 元编程 │ Macros (Swift 5.9+) │ KSP/KAPT │
└─────────────────────────────────────────────────────────────────┘15. Swift vs Go/Java/Rust 对比
Swift vs Go/Java/Rust 关键对比:
┌─────────────────────────────────────────────────────────────────┐
│ 特性 │ Swift │ Go │ Java │ Rust │
├─────────────────────────────────────────────────────────────────┤
│ 类型系统 │ 静态强类型 │ 静态弱类型 │ 静态强类型 │ 静态强类型 │
│ 内存管理 │ ARC │ GC │ GC │ Ownership │
│ 并发模型 │ async/await │ goroutine │ thread │ ownership │
│ 泛型 │ ✅ │ ✅ │ ✅ (擦除) │ ✅ (编译期) │
│ 内存安全 │ 运行时 │ GC │ GC │ 编译期 │
│ 空安全 │ Optional │ 无 │ Optional │ Option<T> │
│ 模式匹配 │ ✅ │ ❌ │ ✅ (switch) │ ✅ │
│ 协议/接口 │ Protocol │ interface │ interface │ trait │
│ 宏/元编程 │ Macros │ 无 │ Annotation │ macro │
│ 跨平台 │ iOS/macOS │ 跨平台 │ JVM │ 跨平台 │
│ 性能 │ 高 │ 高 │ 中 │ 极高 │
│ 学习曲线 │ 中等 │ 低 │ 高 │ 极高 │
│ 适用场景 │ iOS/后端 │ 后端/云 │ 企业级 │ 系统级 │
└─────────────────────────────────────────────────────────────────┘16. 面试考点汇总
高频面试题
Q1: Swift 类型系统与 Objective-C 的区别?
答:
- Swift:静态类型、强类型、编译期检查、泛型、空安全
- Objective-C:动态类型、弱类型、运行时检查、无泛型、nil 作为对象
- Swift 的 Optional 系统提供编译期空安全
- Swift 支持泛型,Objective-C 不支持(@class 只是向前声明)
- Swift 有协议导向编程(POP),Objective-C 只有 OOP
Q2: struct 和 class 的区别?什么时候用哪个?
答:
- struct:值类型、栈分配、拷贝创建新实例、无 ARC、线程安全
- class:引用类型、堆分配、引用共享、需要 ARC、需要手动管理循环引用
- 性能:struct 拷贝 O(1)(指针拷贝),class 引用 O(1)(指针拷贝)+ retain/release
- 优先使用 struct,需要 class 的特性时再切换到 class
- struct:数据模型、配置对象、值类型(坐标、颜色、矩形)
- class:UI 组件、网络客户端、数据库连接、需要继承/多态
Q3: Optional 的底层实现和解包方式?
答:
- Optional<T> 是 enum Optional<T>
- Swift 4+ 优化:整型可选复用高位作为 tag,指针可选使用低位作为 tag
- Optional<Float> 使用 NaN 的 quiet bit 作为 tag
- 解包方式:if let/guard let(安全)、!(强制)、?(可选链)、??(默认值)
- [weak self] 打破循环引用
Q4: 协议导向编程(POP)的核心?Witness Table 机制?
答:
- 用协议定义行为,用值类型实现
- 协议扩展提供默认实现
- Witness Table 编译期静态绑定(零开销)
- 多态通过协议实现而非继承
- 默认优先使用 struct
Q5: Swift 泛型的底层原理?Monomorphization?
答:
- 编译期生成特化代码(零运行时开销)
- Monomorphization:为每个具体类型生成独立代码
- 不需要类型擦除(Any)
- 泛型约束在编译期验证
- associatedtype vs 泛型参数
Q6: Swift 内存模型?ARC 完整机制?
答:
- 栈:局部变量、函数参数、自动释放池
- 堆:引用类型实例、逃逸闭包、关联对象
- ARC:编译器自动插入 retain/release
- __TEXT:代码,__DATA:全局变量
- 循环引用:weak/unowned 解决
- deinit:对象被释放时调用
Q7: Swift 字符串底层实现?性能优化?
答:
- UTF-8 编码,SSO 优化(≤15字符内部存储)
- 大字符串堆分配
- 索引对应 Unicode 标量位置
- 使用 .count 而非 .utf8.count
- 使用 String.Index 而非 Int 索引
Q8: Swift vs Kotlin 的核心差异?
答:
- Swift:POP(协议导向)— 默认 struct
- Kotlin:OOP(面向对象)— 默认 class
- Swift:强类型编译期检查(无 null)
- Kotlin:类型系统区分 null 和非 null(Int vs Int?)
- Swift 无泛型擦除,Kotlin 有泛型擦除
- Swift 默认值语义,Kotlin 默认引用语义
Q9: 可选链的机制?nil 传播原理?
答:
- ?. 返回 Optional,任何一步为 nil → 整体 nil
- 性能:O(1) 单步,O(n) 链式
- nil 传播:短路求值,遇到 nil 立即返回 nil
- 可选链只能访问非可选类型
Q10: Swift 错误处理机制?
答:
- Error 协议
- throw / throws / do-catch
- try / try? / try!
- defer 确保资源释放
- CustomNSError 集成 NSError