【问题标题】:How to convert Giant project Objective C to Swift如何将 Giant 项目 Objective C 转换为 Swift
【发布时间】:2019-03-27 07:25:40
【问题描述】:

我正在运行项目,它非常庞大,它包含近 1000 个文件和 4 个自定义(自己构建的)框架以及通过 Pod 添加的近 10 个其他框架。 我已经通过Migrating Your Objective-C Code to SwiftMigrate with Swiftify

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

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

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

【问题讨论】:

  • 如果它在目标 C 中正常运行,那么最好的办法是保持原样并继续使用目标 C,但如果要求快速而不是在添加新模块时做一件事使用 swift 创建它。
  • 您可以做的另一件事是在模块中破坏您的项目并开始通过模块方法将其更改为 swift
  • 不要将其转换为 Swift。如果正确完成,则无法自动转换为 Swift,您必须重新实现所有内容。在更新文件时转换文件并手动进行。这样,您的项目将一次转换为 Swift 一个文件。使用旧版 Obj-C 没有任何问题。
  • 同时保留 Objective-C 和 Swift。在 Swift 中创建新文件。重做/将 Objective-C 转换为 Swift 意味着每次转换都会修复另一个错误。你有单元测试吗?如果 Objective-C 代码有效,就让它这样吧。不要破坏代码。
  • 最糟糕的是 - 您不能简单/直接将 Objc 语法转换为 Swift 语法。最好的事情是 - 有很多项目成功运行,就像你的项目一样,混合了两种语言。暂时保持原样,开始使用 Swift 开发新模块。如果需要,稍后开始一一编写 Objc 文件的所有语法。找出 Swift 中现有 Objc 版本的外部依赖替换。希望你很快就能用 Swift 构建整个项目..:)

标签: objective-c swift xcode code-migration


【解决方案1】:

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

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

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

以上几点有什么帮助?

  1. 您可能会发现一些不寻常的代码或库。
  2. 您最终可能会在适当的结构下拥有干净的代码
  3. 您现在可以使用“Swift + Objective-C”让您的应用运行顺畅,并定期提供更新,而不是等待几个月才能完全转换。

【讨论】:

  • 您可以从分离类层次结构开始,然后一个接一个地转换“子树”。有趣的事实:一个不影响应用程序的模块可以简单地被踢出而不被转换为任何东西:-)
  • 一个明显的起点是转换自定义框架。
  • IMO,自定义框架作为转换的起点是最不可行的,因为它们(通常)很少修改,因此可以安全地留在 Objective-C 中。如果您逐渐转换您的项目,那么从转换您最常使用的类开始是有意义的。对于将是 View Controller、View 和 Model 类的典型 MVC 项目。
  • @Sohil 谢谢你的回答,我的目标是在Apple停止更新Objective-C之前用Swift转换我的项目,我们不知道Apple什么时候停止更新Obj-C,我阅读一些新闻和论坛,这些新闻和论坛对 Obsoleting Obj-C 有不同的看法,我们的项目每个月都在不断更新新的需求,所以寻找一些转换的解决方案。
  • @Aleem 我认为在一天或几周内转换大型项目是完全不可行的,除非你有一个大的开发团队;)
【解决方案2】:

我最近使用SwiftifySVProgressHUD 转换为swift。转换后的代码可以在here 找到。

主要收获是:

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

详细的转化策略可见here

【讨论】:

  • 这很棒。此外,我建议您从最高级别(通常是 UI)开始,然后开始向内工作,因为可以从 swift 调用 obj-c。
  • 我会在“转换或重构类”之前添加一个步骤“确保该类正在单元测试中”
【解决方案3】:

参考Swiftify

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

第 2 步:SignSign Up 到网站下载应用程序。

第 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 为任何命令设置快捷键(键绑定)。

【讨论】:

【解决方案4】:

这是与其他答案不同的观点。我有一个与原始海报大小相似的项目(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 非常相似。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2022-01-10
    相关资源
    最近更新 更多