8

我正在运行项目,它非常庞大,它包含近 1000 个文件和 4 个自定义(自己构建的)框架,以及通过 Pods 添加的近 10 个其他框架。我已经完成了将您的 Objective-C 代码迁移到 Swift使用 Swiftify 进行迁移

我开始按照 Apple 的建议逐个转换每个文件,但是 Swiftify 没有成功完成第一次转换,而且还存在依赖性问题。

所以在这个位置看起来我开始在撒哈拉沙漠中行走,在那里我看不到任何终点。

所以我需要一些建议如何将这种大规模的项目转换为 Swift?

4

4 回答 4

10

我最近使用Swiftify将SVProgressHUD转换为 swift 。转换后的代码可以在这里找到。

主要的收获是:

  1. 要一次开始一个文件的代码转换,保持与 Objective C 的互操作性,即转换后的 swift 文件应该与您现有的 Objective-C 代码互操作。
  2. 选择一个没有子类且简单的类。

转换策略流程图

详细的转换策略可以在这里找到。

于 2018-12-06T19:21:48.933 回答
9

您将 Objective-C 转换为 Swift 的方法是错误的!Apple 也花了一些时间在他们的框架中完全采用 Swift,而消息是在 2018 年,85% 的框架都转换为 Swift,所以关键是他们也花了将近 3 年的时间才完成!

最大的问题是 Swift 仍在不断发展,可能明年我们可能会看到“Swift 5.0”。所以我建议你通过以下方式:

  1. 选择最新版本的 Swift(即 4.2)。
  2. 与其开始转换完整的项目,不如采用模块化方式。
  3. 从您的项目中,首先开始挑选不会以任何方式影响应用程序的较小模块,并查看“Swift”文件是否适用于 Objective-C(您的旧代码)。参考:如何将 Swift 代码导入到 Objective-C?
  4. 一旦你完成了较小的模块,慢慢开始挑选大模块,你也可能会在你的项目中找到 Objective-C 中的开源 Swift 库。
  5. 此外,您还可以以较小项目的形式从头开始构建模块,然后将其拖放到 Objective-C 项目中。
  6. Andreas Oetjen建议:您可以从分离类层次结构开始,然后转换一个“子树”。

以上几点有什么帮助?

  1. 您可能会发现一些不寻常的代码或库。
  2. 您最终可能会在适当的结构下拥有干净的代码
  3. 到目前为止,您可以使用“Swift + Objective-C”来使您的应用程序顺利运行并定期提供更新,而不是等待几个月才能完全转换它。
于 2018-10-23T06:50:58.080 回答
2

参考Swiftify

第 1 步:确保您拥有最新版本的 Xcode(推荐 Xcode 11 及更新版本)。

第 2 步:注册注册到网站以下载该应用程序。

第 3 步:下载并安装适用于 Xcode 的 Swiftify。

第 4 步:如果应用程序被阻止运行,请转到 Apple 菜单 > 系统偏好设置... > 安全和隐私 > 常规选项卡。在标有“允许从以下位置下载应用程序”的部分下,选择“Mac App Store 和已识别的开发者”。

在此处输入图像描述

第 5 步:从 Applications 文件夹中运行“Swiftify for Xcode”并输入以下 API 密钥:

Please, Sign In or Sign Up Free to get your own API key.

第 6 步:如果 Editor 菜单中没有任何内容,请打开 System Preferences -> Extensions 并在“Swiftify for Xcode”旁边打勾。

在此处输入图像描述

第 7 步:运行(或重新启动)Xcode 并检查 Editor -> Swiftify 菜单。 在此处输入图像描述

第 8 步:新的 Finder 扩展允许您使用右键菜单将文件、文件夹甚至 ZIP 存档与您的项目一起转换: 在此处输入图像描述

第 9 步:您还可以使用右键菜单转换来自大多数 macOS 文本编辑器应用程序的代码: 在此处输入图像描述

第 10 步:您可以通过 Xcode -> Preferences -> Key Bindings 为任何命令设置快捷方式(键绑定)。 在此处输入图像描述

于 2021-07-16T04:54:34.627 回答
0

这是与其他答案不同的观点。我有一个与原始海报大小相似的项目(250 个课程,7 MB 的源代码)。我不希望长期维护两种不同编程语言的混合体的精神负担。在转换了大约 30 个类之后,我发现自己大部分时间都在调整代码以实现 Objective-C 和 Swift 之间的互操作性。问题包括:

  • 像 Array 和 NSMutableArray 这样的一些类型不能自动互换,所以我不得不插入很多额外的类型转换。甚至 Objc-C int 和 Swift Int 也需要强制转换。

  • 枚举等其他类型在 Obj-C 中的支持有限——例如​​,Swift 枚举不能用作函数参数类型——所以我可以使用的 Swift 新特性受到限制。我发现自己做了很多临时编码,并记录了一旦 Obj-C 消失后可能发生的变化。

  • Xcode 自动生成一个桥接头以将 Objc-C 类公开给 Swift,但它对可能造成不匹配的命名约定做出了假设。该文件无法手动编辑,有时需要几个清理/构建周期才能更新。

  • Swift 类可以继承自 Obj-C 类,但 Obj-C 类不能继承自 Swift 类。这意味着我必须首先转换超类的所有子类,然后转换超类,然后返回并调整所有子类,并在我处理树时重复该循环。

最终感觉在临时设置上花费了太多时间,我决定只推动完全转换,而不进一步关注互操作性。不久之后,Xcode 的实时错误检查(红色和黄色图标)放弃了,让我没有编译器的帮助......所以当一切都被转换并且我能够再次尝试构建时,我有 8000 个编译器要处理的错误。但这终于完成了,现在我正在运行和测试我 98% 的 Swift 应用程序(我有一些小型的第三方实用程序,我暂时不用了)。

最初的海报将他的项目比作穿越撒哈拉沙漠。我一直把我的项目想象成 500 英里的徒步旅行。放弃的编译器就像用完了水,然后修复所有这些错误就像在泥泞中完成最后 50 英里的上坡。但我喜欢徒步旅行,所以这个比喻让我保持动力。:-)

我有一些小项目,当我转换它们时,我会一次性完成它们。我想说你的项目越小,混淆两种语言之间的互操作性的理由就越少。

顺便说一句,我的过程是使用Swiftify一次转换几个文件,然后逐行手动清理它们,有时每小时只有 200 行。通过所有的清理工作,我估计Swiftify将转换时间缩短了一半——并不令人惊讶,但仍然值得。我在 Kotlin 中有同一个项目的 Android 版本,有时复制和粘贴 Kotlin 代码并将其调整为 Swift 比从 Objective-C 转换更快,因为 Kotlin 和 Swift 非常相似。

于 2021-01-27T21:18:35.253 回答