Xcode 8.0 Swift 3.0缓慢索引和构建

Dan*_*nny 61 indexing xcode ios swift3 xcode8

我已经安装了Xcode 8.0并将Swift 2.2转换为3.0(这个过程也花费了很多时间,我只是让我的Mac一整晚都在运行).我没有一个大项目(大约20个文件).我也在用Pods.索引以前的Xcode版本(<8.0)工作得很快但现在,升级后,进度条卡在一个位置(我已经等了一个小时).

我试过的事情对我没有帮助:

  • 清理DerivedData文件夹并重新启动Xcode
  • 清理项目并重新启动Xcode
  • 删除Pods目录,<project>.xcworkspace然后重新安装
  • 重启Mac
  • 尝试没有Pods的构建项目
  • 重新安装Xcode
  • 在克隆项目的另一台Mac上尝试

当开发人员花费数小时来解决这些荒谬的问题时,制作这样的软件版本真的不是很酷.这非常令人失望.任何想法如何解决这一问题?

Chr*_*ris 52

转到项目设置,然后选择编辑器>添加构建设置>添加用户定义的设置,并添加以下内容:

SWIFT_WHOLE_MODULE_OPTIMIZATION = YES
Run Code Online (Sandbox Code Playgroud)

添加此标志会使我们的清理构建编译时间从7分钟下降到65秒,这对于40KLOC swift项目来说是奇迹般的.也可以确认2个朋友在企业项目上看到了类似的改进.

我只能假设这是Xcode 8.0中的某种错误

  • 还没有人提到它,但这打破了渐进式编译.因此,虽然现在干净的构建速度更快,但是当您更改一个文件时,您将失去只需重建几个文件的速度. (5认同)
  • 这有效,但是它打破了你在开发过程中依赖的许多事情:断点和单步执行是不可靠的,当你遇到一个断点并尝试查看变量的内容时,变量不可用,命令+单击跳转到定义几乎不起作用. (3认同)
  • 也为我们的团队工作.我们在Swift和Objective C的代码库上运行Xcode 8.0,Swift 2.3. (2认同)

Dan*_*nny 24

我通过评论所有文件然后逐个删除注释来解决问题.我发现问题仍然在这里描述的数组声明中.

我有这样的代码,项目没有索引:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first, second, third, fourth, fifth]
    }
}
Run Code Online (Sandbox Code Playgroud)

我已将其更改为此并且索引开始工作:

class {
    var first: String!
    var second: String!
    var third: String!
    var fourth: String!
    var fifth: String!

    func abc() -> [String] {
        var array = [first]

        array.append(second)
        array.append(third)
        array.append(fourth)
        array.append(fifth)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能是推断数组类型的问题.而不是使用追加执行:var array:[String] = [first,second,third,fourth,fifth] (6认同)

小智 6

自从升级到Swift 3/XCode 8以来,我遇到了同样的问题,它似乎是由大数组文字引起的.

我能够通过向分配给数组文字的变量添加类型注释来解决问题,例如

let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]
Run Code Online (Sandbox Code Playgroud)

代替

let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
Run Code Online (Sandbox Code Playgroud)


Ste*_*rov 5

我有类似的问题,并按照本指南调试:http://irace.me/swift-profiling 我的问题是我在一些字符串中有nil合并运算符,例如:

let name = "\(someString ?? "")"
Run Code Online (Sandbox Code Playgroud)

并且有四种方法造成2分钟的额外建造时间.


sil*_*one 5

我遇到了同样的问题,并通过逐行仔细地检查代码来解决了这个问题,事实证明,Swift 3更喜欢字符串插值而不是使用+符号,即

let url = "http://yahoo.com" + "someWebPage" + "whereItsInteresting" 
Run Code Online (Sandbox Code Playgroud)

如果你已经使用上面的代码样式取代它;

let url = "http://yahoo.com\(someWebPage)\(whereItsInteresting)"
Run Code Online (Sandbox Code Playgroud)

您的构建时间将立即恢复正常。