ObjC 到 Swift 迁移
问题
大型 ObjC 项目如何渐进式迁移到 Swift?
答案
迁移策略
关键步骤
| 阶段 | 内容 |
|---|---|
| 1. 基础设施 | 配置 Bridging Header,确保互操作 |
| 2. 新代码 | 所用新文件用 Swift,旧代码不动 |
| 3. 工具类 | 迁移 Utils、Models 等无依赖模块 |
| 4. 业务模块 | 按模块整体迁移,减少混编 |
| 5. 清理 | 逐步删除 ObjC 文件,移除 Bridging Header |
互操作要点
// Swift 调用 ObjC:
// 通过 MyApp-Bridging-Header.h 导入 ObjC 头文件
// ObjC 调用 Swift:
// #import "MyApp-Swift.h"(自动生成)
// Swift 类需要继承 NSObject 并标记 @objc
@objc class UserManager: NSObject {
@objc static let shared = UserManager()
@objc func logout() { ... }
}
常见坑点
| 问题 | 解决 |
|---|---|
| 循环引用桥接头文件 | 使用 forward declaration @class |
| ObjC 泛型丢失 | 用 __kindof、NS_SWIFT_NAME 标注 |
| 枚举不互通 | ObjC 用 NS_ENUM,Swift 用 @objc enum |
| KVO 失效 | Swift 属性加 @objc dynamic |
常见面试问题
Q1: 大项目迁移最大的风险是什么?
答案:编译时间暴增。Swift 和 ObjC 混编时,每个 Swift 文件修改都会重新生成 -Swift.h,导致大量 ObjC 文件重编。建议尽早做模块化,将 Swift 代码独立成 framework,减少跨语言边界。