After iPhone app that I'm writing in Swift become quite big (> 150 .swift files + various Objective-C libs), Xcode start behave pretty badly:

  • 每一秒我都会遇到各种各样的错误,例如:

    Command failed due to signal: Segmentation fault: 11

  • compilation take enormous amount of time (> 2 min on MacBook Pro Retina)
  • 等等

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

到目前为止我所做的工作——我将项目拆分为几个动态框架,并与主项目链接,这有助于减少编译时间,但也带来了一些新问题.

我还使用iRamDisk在RAM中保存DerivedData个文件夹,并定期从中删除所有文件,这有时有助于解决SourceKit崩溃问题.

推荐答案

Swift toolchain仍然有点粗糙,在苹果修复之前,你需要使用一些临时的解决方法(见下面的UPDATES)

下面是一个 list ,你可以做一些事情来防止自己发疯.

Slowness caused by immature Swift compiler

  • 使用Injection for Xcode更改开发工作流程.一旦安装了插件,就可以在模拟器\设备without重新编译中插入代码更改.您不需要硬编码\修改项目中的任何内容.我们最近开始在工作中使用它,它对我们产生了巨大的影响,即使它不适用于每个用例(例如,你不能创建新函数,你只能修改现有函数).

  • 编译器不喜欢某些特定的代码 struct ,并且需要花费太多时间来编译.最常见的问题是类型判断器,它根据需要执行的类型判断的数量以指数方式降低编译时间(阅读here多个实用示例,阅读here多个详细解释).为了确定您是否遇到了这个问题,您可以遵循以下blog post,您将通过使用一些编译器附加标志来收集有关创建慢度的函数的信息.或者,您可以使用这个Xcode plugin来确定构建缓慢的来源.

  • Use dynamic frameworks wisely, where it makes sense. A framework recompilation will be done only when you modify one of its Swift files (dynamic frameworks are only available for iOS >= 7).

  • 在相同的文件中压缩代码.减少Swift文件的数量可以明显加快编译过程.通过添加用户定义的自定义标志SWIFT_WHOLE_MODULE_OPTIMIZATION并将其设置为"是",同时将优化级别设置为"无"(禁用优化将使其变慢),可以很容易地实现"整个模块优化"(OUTDATED).您可以考虑使用这gist个,它是一个构建脚本,在"合并.SWIFT"文件中折叠所有代码.

  • 仔细判断 list here(还有一些其他原因,因为编译速度慢)

  • OUTDATEDtry 本blog post中描述的方法,它涉及创建生成make文件的构建脚本.它需要手动干预构建脚本(它包含swift文件列表)

  • OUTDATEDtry this种黑客攻击的增量编译技术

UPDATE: Incremental builds introduced on Swift 1.2 (Xcode 6.3)

苹果最终推出了Swift 1.2(Xcode 6.3附带)的增量版本.虽然还不够完美,但这是一个巨大的进步.

从现在起,只有当类被更改时(或者当它所依赖的一个类被更改时),才会重新编译该类.

UPDATE: Recompile dependent classes only when public interface changes introduced on Swift 2.1 (Xcode 7.1)

从Swift 2.1(Xcode 7.1)开始,依赖类仅在更改类的公共接口时重新编译,而不是每次更改时重新编译.这对大型项目尤其重要.

Project (mis)configuration (not related to Swift)

  • 确保"仅构建活动体系 struct "对于调试是肯定的.
  • 确保没有添加花费太多时间的编译前/编译后脚本.

Swift相关问答推荐

在swift静态var扩展中,如何或可以访问和返回具体类?

如何避免使用DispatchSemaphores时线程爆炸?

SwiftUI—如何识别单词并获取视觉中的位置

KMM-Swift铸造密封类

可以';t在标记为@Observable的类上使用属性包装

SwiftData:非法try 在不同上下文中的对象之间建立关系

Swift Property Wrappers-Initialization 失败并显示无法将‘Double’类型的值转换为预期的参数类型

UIButton 配置不更新按钮标题

数组使用偏移量对自身执行 XOR

Vapor Swift 如何配置客户端连接超时

Swift中的分段错误

Swift 动画 WithDuration 语法是什么?

如何快速截取 UIView 的屏幕截图?

是 swift 中另一个日期的同一周、月、年的日期

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

无法推断泛型参数的参数

不能从非开放类继承 swift

无法停止 AVPlayer

如何发送静默推送通知有效负载

使用相机进行人脸检测