跳到主要内容

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,减少跨语言边界。

相关链接​