Swift 与 Objective-C:混合项目导入指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何将 Swift 代码导入 Objective-C:带真实示例的分步指南



您是否曾遇到过需要将全新的 Swift 模块添加到旧的 Objective-C 项目中的情况?或者,也许您的团队正在逐步从 Objective-C 迁移到 Swift,但目前仍不得不在混合模式下工作?如果是这样——您来对地方了。“如何将 Swift 代码导入 Objective-C?” 这个问题是 Stack Overflow 上最热门的问题之一(有数万次浏览),这并不奇怪:即使是经验丰富的开发人员有时也会在配置两种语言之间的桥接时感到困惑。



在本文中,我们将详细讨论如何正确地将 Swift 代码导入 Objective-C,您会遇到哪些陷阱,以及如何避免让您的项目变成一团乱麻。我们开始吧!



为什么 Swift 和 Objective-C 仍然共存?



许多人认为,随着 Swift 的出现,所有人都放弃了 Objective-C 并转向了新语言。现实情况更为复杂。成千上万的大型项目(包括银行、社交网络和企业系统的应用程序)都是用 Objective-C 编写的,完全重写它们是一项需要数年的任务。因此,Apple 提供了一种交互机制:您可以用 Swift 编写新功能,而将旧代码保留在 Objective-C 中。



关键问题是:Swift 和 Objective-C 是不同的世界。Swift 编译成自己的二进制格式,Objective-C 也编译成自己的格式。为了让它们能够“看到”彼此,需要一个特殊的桥接——用于将 Objective-C 导入 Swift 的 bridging header,以及用于将 Swift 导入 Objective-C 的自动生成的头文件。



工作原理:Swift 如何看到 Objective-C,反之亦然



让我们立即明确方向:



  • Objective-C → Swift: 使用生成的文件 ProductModuleName-Swift.h(其中 ProductModuleName 是您的模块名称)。
  • Swift → Objective-C: 使用 bridging header(ProjectName-Bridging-Header.h)。


今天我们关注的是第一种情况。但为了全面理解,了解两者都是有益的。



步骤 1:配置项目以支持协同工作



在将 Swift 代码导入 Objective-C 之前,请确保您的项目配置正确。如果您从头开始创建项目并计划采用混合架构——这很简单。如果项目已经基于 Objective-C——则需要添加对 Swift 的支持。



检查 Build Settings 设置



在 Xcode 中打开您的目标(Target)设置,找到参数 “Defines Module”。它必须设置为 Yes。如果没有,请手动添加:



// Build Settings → Packaging → Defines Module = YES


然后找到 “Product Module Name”——这将是生成的头文件中使用的名称。默认情况下,它与项目名称相同,但您可以更改它(例如,MyApp)。



创建 bridging header(如果没有)



当您首次将 Swift 文件添加到 Objective-C 项目时,Xcode 会提示您创建 bridging header。请同意。如果您错过了这一步——请手动创建文件:New File → Header File 并将其命名为 YourProjectName-Bridging-Header.h。然后在设置中指定其路径:



// Build Settings → Swift Compiler - General → Objective-C Bridging Header// 示例:$(SRCROOT)/$(PROJECT_NAME)/YourProjectName-Bridging-Header.h


步骤 2:编写一个可从 Objective-C 访问的 Swift 类



并非每个 Swift 类都能自动被 Objective-C “看到”。有几个强制性要求:



  • 该类必须继承自 NSObject(或其他 Objective-C 类)。
  • 您希望从 Objective-C 调用的所有属性和方法都必须使用 @objc 标记。

博客

书籍推荐