跳到主要内容

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 泛型丢失__kindofNS_SWIFT_NAME 标注
枚举不互通ObjC 用 NS_ENUM,Swift 用 @objc enum
KVO 失效Swift 属性加 @objc dynamic

常见面试问题

Q1: 大项目迁移最大的风险是什么?

答案:编译时间暴增。Swift 和 ObjC 混编时,每个 Swift 文件修改都会重新生成 -Swift.h,导致大量 ObjC 文件重编。建议尽早做模块化,将 Swift 代码独立成 framework,减少跨语言边界。

相关链接