ios-如何处理大型Swift项目?

在我用Swift编写的iPhone应用变得非常大(> 150个.swift文件+各种Objective-C库)之后,Xcode的启动行为非常糟糕:

  • 每秒钟编译我都会遇到各种错误,例如:

    DerivedData

  • 编译需要花费大量时间(在MacBook Pro Retina上为2分钟以上)
  • 等等。

我只是想知道每个人是否都遇到同样的问题,也许有人找到了减轻这种噩梦的方法?

到目前为止,我已经完成了什么—我将项目分解为与主项目链接的多个动态框架,这有助于减少编译时间,但会带来一些新问题。

我还使用iRamDisk将DerivedData文件夹保留在RAM中,并定期从中删除所有文件,这有时有助于SourceKit崩溃。

Alexey Globchastyy asked 2020-01-14T05:07:39Z
5个解决方案
58 votes

Swift工具链仍然有些毛病,您需要使用一些临时解决方法,直到Apple对其进行修复(请参阅下面的更新)

这是您可以防止自己发疯的项目清单。

Swift编译器不成熟造成的缓慢

  • 使用Injection for Xcode更改开发工作流程。 安装插件后,无需重新编译就可以将代码更改注入到模拟器\设备中。 您无需对项目中的任何内容进行硬编码/修改。 我们最近开始在工作中使用它,即使它不适用于每个用例(例如,您不能创建新功能,也只能修改现有功能),它对我们方面都产生了巨大影响。

  • 一些特定的代码构造是编译器不喜欢的,并且需要太多时间进行编译。 最常见的问题是类型检查器,它根据需要执行的类型检查次数成倍地减慢编译时间(有关更多信息,请参见此处的实际示例,并在此处进行详细说明)。 为了确定您是否遇到此问题,可以关注此博客文章,您将通过使用一些编译器附加标志来收集有关造成缓慢的函数的信息。 或者,您可以使用此Xcode插件来识别构建缓慢的来源。

  • 在有意义的地方明智地使用动态框架。 仅当您修改其中一个Swift文件时,才会重新编译框架(动态框架仅适用于iOS> = 7)。

  • 将代码压缩在同一文件中。 减少Swift文件的数量可以显着加快编译过程。 您可以通过添加用户定义的自定义标志SWIFT_WHOLE_MODULE_OPTIMIZATION并将其设置为YES,同时将优化级别设置为none(以禁用会使其变慢的优化),来轻松实现启用“整个模块优化”的功能您可能会考虑使用这个要点,它是一个构建脚本,它将所有代码折叠在一个“ merge.swift”文件中。您需要为此创建一个新的目标,但是值得尝试。

  • 请仔细检查此处列出的内容(由于编译速度慢,还有一些其他原因)

  • 过时的尝试此博客文章中描述的方法,它涉及创建一个生成脚本的生成脚本。 它需要对构建脚本进行手动干预(其中包含swift文件列表)。

  • 过时的尝试这种骇人的增量编译技术

更新:在Swift 1.2(Xcode 6.3)上引入的增量构建

苹果最终在Swift 1.2(Xcode 6.3附带)中引入了增量构建。 它仍然不是完美的,但是它是一个巨大的改进。

从现在开始,仅当类更改时(或它所依赖的一个类更改时),才重新编译该类。但是,编译器仍然无法理解对类的更改是否是对其接口的更改。 因此,对类的任何更改都会导致对该类及其所有依赖项的重新编译。

更新:仅当Swift 2.1(Xcode 7.1)引入了公共接口更改时,才重新编译依赖类。

从Swift 2.1(Xcode 7.1)开始,仅当您更改类的公共接口时才重新编译相关类,而不是每次更改时才重新编译。 尤其对于大型项目,这带来了巨大的不同。

项目(错误)配置(与Swift无关)

  • 对于调试,请确保“仅构建活动体系结构”为“是”。
  • 请确保您没有添加花费过多时间的前\后编译脚本。
Daniele answered 2020-01-14T05:09:20Z
2 votes

Apple在技术说明2190中提出了一些加快Xcode构建的建议。您是否考虑过创建和预编译自己的框架以外包未更改的Swift模块或某些/所有Objective-C代码?

在Swift中删除所有类型推断。

这个SO主题有一些不错的主意,这篇博客文章建议

  1. 停止生成dSYM捆绑包,并
  2. 如果使用Clang,请避免使用-O4进行编译。

尽管这些改进中有很多与Objective-C有关,但我很确定,其中一些仍然与Swift相关。

Michael Dorner answered 2020-01-14T05:10:02Z
2 votes

(重新)编译是一个已知问题,我相信很快就会解决。 一些建议:

  • 尽可能使用Objective C-即使它是Swift项目的一部分,它也可以快速编译
  • 将代码拆分为框架
  • 指定类型,而不是由编译器来推断类型

同样,很有可能很快会解决此问题,因此也许最好不要在此刻花费大量资金来重写或重组代码。

MirekE answered 2020-01-14T05:10:40Z
1 votes

您可以尝试:

  • 升级计算机中的RAM量
  • 如果您有多个在同一View Controller上执行操作的.swift文件,请尝试将每个View Controller压缩为一个.swift文件
  • 调整编译源下的设置,以查看是否有重复项,或者是否可以添加任何脚本或设置以使其更快地编译...

您还可以查看这篇文章的答案,以获取一些有关如何减少编译时间的提示

MoralCode answered 2020-01-14T05:11:18Z
1 votes

我发现分段错误和编译缓慢的主要原因之一是对大数组和字典进行硬编码,尤其是在将它们声明为全局常量并尝试从另一个.swift文件中访问它们的值时。 当我将所有这些数据存储在plists中时,这些问题就消失了。

bzz answered 2020-01-14T05:11:38Z
translate from https://stackoverflow.com:/questions/28032506/how-to-handle-large-swift-project