Objective-C 与 Swift 互调完整教程 Objective-C 与 Swift 互调完整教程一、概念前置桥接文件Bridging Header桥接文件是 OC 和 Swift 互调的核心机制它是一个.h文件作用类似于双向翻译官。Xcode 通过这个文件知道哪些 OC 代码需要暴露给 Swift。场景需要的文件谁创建OC 项目 → 添加 Swift项目名-Bridging-Header.hXcode 自动提示创建Swift 项目 → 添加 OC项目名-Bridging-Header.hXcode 自动提示创建Swift → 暴露给 OC项目名-Swift.hXcode自动生成无需手动创建二、场景一OC 项目中添加 Swift 支持第 1 步创建 Swift 文件在 Xcode 中File → New → File...→ 选择Swift File→ 命名并保存。第 2 步创建桥接头文件保存时 Xcode 会弹窗提示“Would you like to configure an Objective-C bridging header?”点击Create Bridging HeaderXcode 会自动生成项目名-Bridging-Header.h。⚠️ 如果误点了Dont Create可以手动创建File → New → File... → Header File然后在Build Settings中搜索Objective-C Bridging Header填入该文件的路径。第 3 步在 Swift 中调用 OC在项目名-Bridging-Header.h中导入需要暴露给 Swift 的 OC 头文件// 项目名-Bridging-Header.h#importPerson.h#importStudent.h#importEcgAnalysisModel.h之后在 Swift 中就可以直接使用这些 OC 类了// Swift 代码letpersonPerson()person.name张三person.age25person.sayHello()第 4 步在 OC 中调用 SwiftSwift 类需要加objc暴露给 OC// Swift 代码importFoundation// 必须继承 NSObject并加 objcobjcMembersclassSwiftManager:NSObject{varname:StringfuncdoSomething(){print(Swift 方法被调用)}}在 OC 文件中导入 Xcode 自动生成的头文件// OC 代码 (.m 文件)#import项目名-Swift.h// Xcode 自动生成无需手动创建// 使用 Swift 类SwiftManager*manager[[SwiftManager alloc]init];manager.name李四;[manager doSomething]; OC 项目互调总结方向操作Swift → 调用 OC在 Bridging-Header.h 中#importOC 头文件OC → 调用 SwiftSwift 类加objcOC 中#import 项目名-Swift.h三、场景二Swift 项目中添加 OC 支持第 1 步创建 OC 文件在 Xcode 中File → New → File...→ 选择Objective-C File→ 命名并保存。第 2 步创建桥接头文件同样Xcode 会弹窗提示创建桥接头文件点击Create Bridging Header。第 3 步在 Swift 中调用 OC在项目名-Bridging-Header.h中导入 OC 头文件// 项目名-Bridging-Header.h#importOldClass.h#importUtils.hSwift 中直接使用// Swift 代码letoldOldClass()old.doSomething()第 4 步在 OC 中调用 SwiftSwift 类加objc暴露objcMembersclassSwiftHelper:NSObject{funcshowMessage(_text:String){print(text)}}OC 中导入项目名-Swift.h#import项目名-Swift.hSwiftHelper*helper[[SwiftHelper alloc]init];[helper showMessage:Hello from OC]; Swift 项目互调总结方向操作Swift → 调用 OC在 Bridging-Header.h 中#importOC 头文件OC → 调用 SwiftSwift 类加objcOC 中#import 项目名-Swift.h四、关键文件对比文件谁创建作用是否手动维护项目名-Bridging-Header.h开发者 / Xcode 自动Swift 调用 OC 的入口✅ 需要手动#import项目名-Swift.hXcode 自动生成OC 调用 Swift 的入口❌ 不需要创建和修改五、关于桥接文件的常见疑问Q1桥接文件中需要写什么桥接文件中只写#import语句把你需要暴露给 Swift 的 OC 头文件放进去。// HeartBook2.0-Bridging-Header.h#ifndefHeartBook2_0_Bridging_Header_h#defineHeartBook2_0_Bridging_Header_h// 这些 OC 类会被 Swift 代码看到#importPerson.h#importStudent.h#importEcgAnalysisModel.h#importServerEcgDataModel.h#importHeartBookReportView.h#endifQ2什么时候需要在桥接文件中添加只有当你要在 Swift 代码中调用某个 OC 类时才需要把那个 OC 类的头文件#import到桥接文件中。场景是否需要添加Swift 代码调用 OC 类✅ 需要在桥接文件中#import对应的 OC 头文件OC 代码调用 Swift 类❌ 不需要引用桥接文件改为引用项目名-Swift.h只在 OC 内部使用 OC 类❌ 不需要直接在 OC 的.m文件中#import即可Q3桥接文件需要被其他文件#import吗不需要。Xcode 在编译时通过Build Settings中的Objective-C Bridging Header配置项自动读取它。你不需要在其他任何地方手动#import它。Q4每次新建 OC 类都要去桥接文件里添加吗是的。如果 Swift 代码需要调用新建的 OC 类就必须去桥接文件里#import它。如果只是 OC 内部使用就不需要。Q5项目名-Bridging-Header.h和项目名-Swift.h是什么关系文件作用谁维护项目名-Bridging-Header.hSwift 能看到哪些 OC 类开发者手动添加#import项目名-Swift.hOC 能看到哪些 Swift 类Xcode 自动生成不要手动修改六、常见问题与避坑指南1.#import 项目名-Swift.h找不到检查Build Settings中Defines Module是否为YES。2. Swift 类在 OC 中无法使用确保类继承了NSObject确保加了objc或objcMembers结构体、枚举等值类型无法直接暴露给 OC3. OC 的nil和 Swift 的nil怎么转换// OC 返回 nil → Swift 中是 OptionalletresultocObject.someMethod()// 类型是 String?4. 桥接文件路径配置如果桥接文件位置移动了需要在Build Settings→Objective-C Bridging Header中更新路径。路径示例HeartBook2.0/HeartBook2.0-Bridging-Header.h5. Swift 调用 OC 的 Block// OC 中的 Blocktypedefvoid(^CompletionBlock)(BOOL success,NSString*_Nullable message);-(void)doTaskWithCompletion:(CompletionBlock)completion;Swift 中调用ocObject.doTask{success,messageinprint(success:\(success), message:\(message??))}6. OC 调用 Swift 的闭包objcMembersclassSwiftService:NSObject{funcfetchData(completion:escaping(String)-Void){completion(数据返回)}}OC 中调用SwiftService*service[[SwiftService alloc]init];[service fetchDataWithCompletion:^(NSString*_Nonnull data){NSLog(收到数据: %,data);}];7. 桥接文件中为什么要用#ifndef ... #endif#ifndefHeartBook2_0_Bridging_Header_h#defineHeartBook2_0_Bridging_Header_h// ... 你的 #import 语句 ...#endif这是标准的 C/C 头文件保护宏作用是防止同一个头文件被重复导入。如果这个头文件被多次#import宏会确保它的内容只被编译一次。这是 Xcode 自动生成的不需要手动修改。七、完整示例OC 项目添加 Swift 的目录结构HeartBook2.0/ ├── HeartBook2.0-Bridging-Header.h // 桥接头文件手动维护 ├── HeartBook2.0-Swift.h // Xcode 自动生成不要手动修改 ├── Person.h // OC 头文件 ├── Person.m // OC 实现 ├── SwiftManager.swift // Swift 文件 └── ViewController.m // OC 调用 Swift桥接文件示例// HeartBook2.0-Bridging-Header.h#importPerson.h#importStudent.h#importEcgAnalysisModel.hSwift 示例// SwiftManager.swiftimportFoundationobjcMembersclassSwiftManager:NSObject{funcgreet(person:Person)-String{return你好\(person.name??未知)}funcprocessEcg(model:EcgAnalysisModel)-Int{returnInt(model.max_heart)}}OC 调用 Swift 示例// ViewController.m#importHeartBook2.0-Swift.h-(void)testSwift{SwiftManager*manager[[SwiftManager alloc]init];Person*p[[Person alloc]init];p.name王五;NSString*greeting[manager greetWithPerson:p];NSLog(%,greeting);}八、快速决策表你的情况要做的事OC 项目想用 Swift 写新功能创建 Swift 文件 → 创建 Bridging-Header → 暴露 OC 类Swift 项目想复用 OC 旧代码创建 OC 文件 → 创建 Bridging-Header → 暴露 OC 类Swift 类想让 OC 调用加objc→ 在 OC 中#import 项目名-Swift.hSwift 代码想调用某个 OC 类在 Bridging-Header 中#import该 OC 类的头文件新建了一个 OC 类Swift 想用它去 Bridging-Header 中#import它的头文件编译报错-Swift.h找不到检查Defines Module YES桥接文件路径不对Build Settings → Objective-C Bridging Header → 修正路径