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 → 修正路径

相关新闻

微信聊天记录导出终极指南:免费备份工具WeChatExporter完整使用教程

微信聊天记录导出终极指南:免费备份工具WeChatExporter完整使用教程

微信聊天记录导出终极指南:免费备份工具WeChatExporter完整使用教程 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾担心珍贵的微信聊天记录会因手机…

2026/7/3 11:55:26阅读更多 →
GitLab高危漏洞深度解析:从攻击链到安全加固实战指南

GitLab高危漏洞深度解析:从攻击链到安全加固实战指南

1. 项目概述:一次由GitLab安全漏洞引发的深度安全复盘最近在安全圈和DevOps社群里,关于GitLab曝出多个高危安全漏洞的消息传得沸沸扬扬。核心问题直指攻击者能够通过构造恶意指令,在无需授权的情况下窃取服务器上的敏感数据,甚至实…

2026/7/3 11:50:25阅读更多 →
IntelliJ IDEA JUnit配置全指南:从零到自动化测试覆盖率85%+的5步极速搭建法

IntelliJ IDEA JUnit配置全指南:从零到自动化测试覆盖率85%+的5步极速搭建法

更多请点击: https://codechina.net 第一章:JUnit与IntelliJ IDEA集成的核心价值与演进脉络 JUnit 作为 Java 生态中事实标准的单元测试框架,其与 IntelliJ IDEA 的深度集成已远超简单的插件支持,演变为一种融合编译、调试、覆盖…

2026/7/3 11:50:25阅读更多 →
MAX9744与PIC18F2525构建高效D类音频放大系统

MAX9744与PIC18F2525构建高效D类音频放大系统

1. MAX9744与PIC18F2525音频系统设计概述 在DIY音频系统和嵌入式音频设备开发中,如何在小体积、低功耗的前提下实现高质量的音频功率输出一直是工程师面临的挑战。MAX9744这款20W立体声D类音频功率放大器芯片,配合PIC18F2525微控制器的灵活控制&#xff…

2026/7/3 13:40:42阅读更多 →
深度解析:元链生活模式底层逻辑与高并发系统架构设计

深度解析:元链生活模式底层逻辑与高并发系统架构设计

在数字经济与实体经济深度融合的背景下,“消费增值”与“本地生活”成为商业破局的重要方向。近期备受市场关注的“元链生活”模式,通过“消费补贴分享裂变区域分润”的闭环设计,有效解决了实体门店拓客难、库存积压等痛点。作为技术开发者&a…

2026/7/3 13:40:42阅读更多 →
PowerAPI部署实战:从编译到运行的完整流程

PowerAPI部署实战:从编译到运行的完整流程

PowerAPI部署实战:从编译到运行的完整流程 【免费下载链接】powerapi Including a power API SO and the Power API Service. 项目地址: https://gitcode.com/openeuler/powerapi 前往项目官网免费下载:https://ar.openeuler.org/ar/ 想要在open…

2026/7/3 13:40:42阅读更多 →
Panalog日志审计系统前台RCE漏洞复现与深度分析

Panalog日志审计系统前台RCE漏洞复现与深度分析

1. 项目概述:一次对Panalog日志审计系统前台RCE漏洞的深度剖析最近在梳理一些网络设备与日志审计系统的历史漏洞时,Panalog大数据日志审计系统的libres_syn_delete.php文件命令执行漏洞(常被标记为CVE-2024-50623)引起了我的注意。…

2026/7/3 13:40:42阅读更多 →
Selenium进阶:动作链、窗口切换与元素等待实战指南

Selenium进阶:动作链、窗口切换与元素等待实战指南

1. 项目概述:从基础定位到高级交互的跨越如果你已经用Selenium写过一些简单的自动化脚本,比如自动登录、填写表单或者抓取静态数据,那你肯定已经体会到了它的便利。但当你开始面对更真实的网页环境时,很快就会发现,光会…

2026/7/3 13:40:42阅读更多 →
从“记账工具”到“AI军师”,服装实体店如何跨越SaaS 1.0的数字化陷阱?

从“记账工具”到“AI军师”,服装实体店如何跨越SaaS 1.0的数字化陷阱?

一、服装门店的数字化,为何越“升级”越焦虑?走进杭州四季青、广州十三行,你会发现每个服装档口的老板都在谈论“系统”。从手写到电子表格,再到如今的SaaS进销存,表面看是管理手段的进步,但大量商家的真实…

2026/7/3 13:35:41阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月,Boris Cherny 公开宣布自己卸载了 IDE。一时间,Vibe Coding 成了全行业最热的话题。6个月后,当我们回过头来拉一份真实账本,发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/7/2 12:10:34阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言:审计结束三个月了,审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间,内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中,审计…

2026/7/2 12:10:34阅读更多 →
LV3296与PIC18F45K22的UART通信与USB扩展方案

LV3296与PIC18F45K22的UART通信与USB扩展方案

1. LV3296与PIC18F45K22的硬件搭档解析在嵌入式数据采集系统中,LV3296条形码扫描模块与PIC18F45K22微控制器的组合堪称经典搭配。LV3296作为一款工业级条码扫描头,其核心是一颗高性能CMOS图像传感器,配合专用解码芯片,能自动识别包…

2026/7/3 0:03:41阅读更多 →
AI初创生存指南:6个月完成可信度验证闭环

AI初创生存指南:6个月完成可信度验证闭环

1. 这不是“逆袭指南”,而是一份AI初创公司真实生存手记“How To Beat Odds As an AI Startup?”——这个标题乍看像一句热血口号,但在我带过7个从0到1的AI产品团队、亲手踩过融资失败、技术债崩盘、客户POC卡在最后一公里等23类典型坑之后,…

2026/7/3 0:03:41阅读更多 →
多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

多模态+推理链+RAG 2.0+智能体:工业级AI系统落地四支柱

1. 这不是又一篇“AI趋势速览”,而是一份实操者手记:当多模态、推理链、检索增强与智能体协作真正撞进工程现场“LAI #73”这个编号本身就像一个暗号——它不属于某家大厂的白皮书,也不是学术会议的议程表,而是长期泡在模型训练集…

2026/7/3 0:03:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/3 1:12:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/3 1:36:36阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/3 2:08:15阅读更多 →