编译速度优化
问题
大型 iOS 项目编译慢怎么优化?
答案
编译耗时分析
# Xcode Build Settings 添加
OTHER_SWIFT_FLAGS = -Xfrontend -warn-long-function-bodies=100
# 超过 100ms 的函数体会给出警告
优化策略
| 策略 | 效果 | 说明 |
|---|---|---|
| 模块化 | ⭐⭐⭐⭐⭐ | 未修改的模块不重新编译 |
| 减少类型推断 | ⭐⭐⭐ | 显式类型声明加速类型检查 |
| 避免复杂表达式 | ⭐⭐⭐ | 拆分三元/链式表达式 |
| Forward Declaration | ⭐⭐ | ObjC 减少 #import |
| Xcode 并行编译 | ⭐⭐ | Build Settings: 开启并行构建 |
| 预编译框架 | ⭐⭐⭐⭐ | SPM 二进制目标、XCFramework |
编译慢的 Swift 代码
// ❌ 编译器类型推断困难(可能耗时数秒)
let result = items.map { ($0.name, $0.age) }
.filter { $0.1 > 18 }
.sorted { $0.0 < $1.0 }
.reduce("") { $0 + $1.0 + "\n" }
// ✅ 显式类型 + 拆分步骤
let mapped: [(String, Int)] = items.map { ($0.name, $0.age) }
let filtered = mapped.filter { $0.1 > 18 }
let sorted = filtered.sorted { $0.0 < $1.0 }
let result = sorted.reduce("") { $0 + $1.0 + "\n" }
模块化编译优势
┌─── App Target(仅改了 1 个文件)
│ └── 增量编译 ✅
├─── FeatureA.framework(未修改)
│ └── 跳过编译 ✅
├─── FeatureB.framework(未修改)
│ └── 跳过编译 ✅
└─── Core.framework(未修改)
└── 跳过编译 ✅
常见面试问题
Q1: Swift 的 Whole Module Optimization 是什么?
答案:默认 Swift 按文件编译(增量编译友好)。开启 -whole-module-optimization(Release 默认)后,编译器同时看到整个模块的所有源文件,可以做跨文件内联、Dead Code Elimination 等全局优化。代价是增量编译失效,全量重编。