文章

将 Objective-C 代码迁移到 Swift

学习迁移代码的推荐步骤。

概览

你可以在 Swift 中替换 Objective-C App 的部分代码,从而改进 App 的架构、逻辑和性能。互操作性助你有条不紊地将迁移到 Swift 的特性整合到 Objective-C 代码中。你无需立刻在 Swift 中重新编写整个 App。

清理你的代码

对现有的 Objective-C 代码库进行清理和现代化改造,确保你的 Objective-C 代码和 Swift 代码具有最佳的兼容性。例如,如果你的代码库中有些部分尚未添加为空性注释,现在是时候添加这些注释了。确保你的代码遵循现代编程做法,以便能够更加高效地与 Swift 交互。

迁移你的代码

要将代码迁移到 Swift,最有效的方法是逐个文件迁移,即每次迁移一个类。由于你无法在 Objective-C 中将 Swift 类归为子类,因此最好在 App 中选用没有任何子类的类。你可以将这个类的 .m.h 文件替换为单个 .swift 文件。你的实现和接口全部都直接并入这一个 Swift 文件中。你不用创建标头文件;Xcode 会在你需要引用时自动创建标头。

  1. 通过选取“File”(文件) >“New”(新建) >“File”(文件) >“(iOS, watchOS, tvOS, or macOS)”(iOS、watchOS、Apple TVOS 或 macOS) >“Source”(来源) >“Swift File”(Swift 文件),为对应的 Objective-C .m 和 .h 文件创建 Swift 类。你可以使用与 Objective-C 类相同的名称,也可以使用不同的名称。类前缀在 Swift 中是可选的。

  2. 导入相关的系统框架。

  3. 如果你需要从 Swift 文件中相同的 App 目标访问 Objective-C 代码,应填充 Objective-C 桥接标头。

  4. 要让你的 Swift 类可以在 Objective-C 中访问和使用,应使它成为某个 Objective-C 类的子代。要为在 Objective-C 中使用的类指定一个特定名称,应给它标上 @objc(name),其中 name 是你的 Objective-C 代码用于引用 Swift 类的名称。

迁移期间

  • 你可以通过将 Objective-C 类归入子类、采用 Objective-C 协议等方法,设置你的 Swift 类来整合 Objective-C 行为。

  • 在处理 Objective-C API 时,你需要知道 Swift 是如何转换某些 Objective-C 语言特性的。有关更多信息,请参阅“Objective-C 和 C 代码自定 (英文)”。

  • 必要时使用 @objc(name) 属性为各种属性和方法提供 Objective-C 名称。

  • 分别使用 funcclass func 来表示实例 (-) 和类 (+) 方法。

  • 将简单的宏声明为全局常量,并将复杂的宏转换为函数。

完成之后

  • 更新 Objective-C 代码中的 import 语句 (更新为 #import "ProductModuleName-Swift.h") 来引用你的新 Swift 代码。

  • 通过取消选择目标成员资格复选框,从目标中移除原始的 Objective-C .m 文件。不要立即删除 .m.h 文件;它们可以在故障诊断时使用。

  • 如果你为 Swift 类提供了不同的名称,应将你的代码更新为使用 Swift 类名称,而不是 Objective-C 名称。

故障诊断技巧和提醒

迁移体验会因你的现有代码库而有所不同,但这里的一些通用步骤和工具可以帮助你对具体过程进行故障诊断:

  • 请记住,你无法在 Objective-C 中将 Swift 类归为子类。因此,你迁移的类不能有任何 Objective-C 子类。

  • 在将类迁移到 Swift 后,你必须在构建之前从目标中移除对应的 .m 文件,以便避免重复符号错误。

  • 要使 Swift 类能够在 Objective-C 中使用,应使它成为 Objective-C 类的子代。

  • 按住 Command 键点按 Swift 类名称可以查看其生成的标头。

  • 按住 Option 键点按符号可以查看相关的隐含信息,如类型、属性和文档注释。

另请参阅

语言互操作性

Objective-C 和 C 代码自定 (英文)

在 Objective-C API 中使用宏来自定将它们导入到 Swift 的方式。

Cocoa 设计模式 (英文)

在 App 中采用 Cocoa 设计模式并与其进行互操作。

在 Swift 中处理动态类型的方法和对象

将 Objective-C id 类型的实例转换为特定的 Swift 类型。

在 Swift 中使用 Objective-C 运行时特性

使用选择器和键路径与动态 Objective-C API 进行交互。

导入的 C 和 Objective-C API (英文)

使用原生 Swift 语法与 C 和 Objective-C 中的类型和函数进行互操作。