XCode 8.0 Swift 3.0慢速索引和构build

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

我试过的东西没有帮助我:

  • 清理DerivedData文件夹并重新启动XCode
  • 清理该项目并重新启动XCode
  • 使用<project>.xcworkspace删除Pods目录,然后再次安装
  • 重新启动Mac
  • 尝试没有豆荚的生成项目
  • 重新安装XCode
  • 在另一个与克隆项目的Mac上尝试

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

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

 SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

添加这个标志,我们的清理编译时间从7分钟到65秒,奇迹般地进行了40KLOC的快速工程。 也可以确认2个朋友在企业项目上看到了类似的改进。

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

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

我有这样的代码和项目不索引:

 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] } } 

我已经改变了这一点,索引开始工作:

 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) } } 

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

我能够通过向分配给数组文本的variables添加types注释来解决这个问题

 let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"] 

代替

 let array = ["1", "2", "3", "4", "5", "6", "7", "8"] 

我有类似的问题,并按照本指南进行debugging: http : //irace.me/swift-profiling我的问题是我有一些string中的零合并运算符例如:

 let name = "\(someString ?? "")" 

四种方法导致build筑时间增加2分钟。

我有同样的问题,并通过辛苦地通过我的代码一行一行地解决它,事实certificate,Swift 3喜欢string插值,而不是使用+符号,即

 let url = "http://yahoo.com" + "someWebPage" + "whereItsInteresting" 

如果您已经使用上述代码样式replace它;

 let url = "http://yahoo.com\(someWebPage)\(whereItsInteresting)" 

你的编译时间会立即恢复正常。

对于那些想要find编译器被“捕获”

添加到Other Swift Flags -Xfrontend -warn-long-function-bodies=50

在这里查看完整答案

我尝试了上述解决scheme,但问题仍然存在。 debugging工作也很奇怪。 经过几天的研究,我发现下面的解决scheme。

select主目标>构build设置。 configuration为下面的图像。

在这里输入图像说明

我遇到了相同的索引问题,但是只有当我在设备上运行/debugging,然后切换到左上angular工具栏上的其他设备(Target> iPhone)时才会发生。

上面的解决scheme都没有为我工作。

我的解决scheme:我删除了我的本地git工作副本,并从我的“起源”克隆了一个新的工作副本。

(xcuserdata / shared / session等文件夹中有一些“魔术”文件可能导致此问题?)

添加设置后,

 SWIFT_WHOLE_MODULE_OPTIMIZATION = YES 

我们的项目干净的编译时间从1200年到180年650个快速文件。 但是这会导致编译失败。 每增加编译时需要180s编译才需要60s

这是一个Xcode错误(Xcode 8.2.1),当你有一个大的字典文字或嵌套的字典文字时,它会发生。 你必须把你的字典分解成更小的部分,并用append方法添加它们,直到苹果修复这个错误。

当“索引”被卡住时,这在Xcode 8.2.1和Swift 3中适用于我:

我总是打开两个项目,一个虚拟项目和我正在进行的项目。 我也有一个iPad Air设备连接,我运行我的项目。 当我的项目卡住“索引”时,我切换到我的虚拟项目,并在我连接的iPad Air设备上运行我的项目。 然后,我停止了这个项目,并切换回正在进行的项目,“索引”function就神奇地完成了。 这也应该只适用于模拟器,如果你没有连接的物理设备。

不是我认为这跟OP的问题有关,但是最近我的XCode 8放缓了。 我最终发现这是我的错误(我记得无意中这样做了) – 我添加了XCode.app作为框架引用。 这基本上使XCodesearch和索引整个XCode.app文件夹。 一旦我看到了错误,并删除框架,它又来了:)

我有一个function,花了一分钟的时间来编译,经过一番调查,我发现罪魁祸首是检查是否有足够的时间已经过去了,从存储date:

 let myStoredDate: Double = // Double representing a time in the past // if at least one week (60 * 60 * 24 * 7 seconds) has passed since myStoredDate if Date().timeIntervalSince1970 - myStoredDate > (60 * 60 * 24 * 7){ // do stuff } 

这段代码需要花费10多秒的时间进行编译 – 再加上这个代码被多次重复使用不同的数字,导致编译时间过长。 我能够通过预先计算间隔来解决这个问题

 let myStoredDate = // Double representing a time in the past //it is important to explicitly specify that the variable is a Double let interval: Double = 60 * 60 * 24 * 7 if Date().timeIntervalSince1970 - myStoredDate > interval{ // do stuff } 

在我做了10次这样的检查之后,编译时间从一分多钟缩短到了几毫秒。

这种问题极有可能发生在其他地方的type-in​​ferance和math的组合中,所以确保在你的代码中没有其他地方发生这种情况。

我的问题是字典。 我有不同的大字典。

 let values = ["address":addressTextField.text,"city":cityTextField.text,"zipCode":zipCodeTextField.text,"state":stateTextField.text,"pet":answerLabel.text,"rentStart":rentStartTextField.text,"rentEnd":rentEndTextField.text,"rent":rentTextField.text,"phone":phoneTextField.text,"email":emailTextField.text,"status":leaseStatusTextField.text,"bedrooms":bedroomTextField.text,"parking":parkingLabel.text,"furnish":furnishLabel.text,"utilities":utilitiesTextField.text,"laundry":laundryTextField.text,"paymentCycle":paymentCycleTextField.text,"note":noteTextView.text] 

我把它分解为:

  var values = ["address":addressTextField.text] values["city"] = cityTextField.text values["zipCode"] = zipCodeTextField.text values["state"] = stateTextField.text values["pet"] = answerLabel.text values["rentStart"] = rentStartTextField.text values["rentEnd"] = rentEndTextField.text values["rent"] = rentTextField.text values["phone"] = phoneTextField.text values["email"] = emailTextField.text values["status"] = leaseStatusTextField.text values["bedrooms"] = bedroomTextField.text values["parking"] = parkingLabel.text values["furnish"] = furnishLabel.text values["utilities"] = utilitiesTextField.text values["laundry"] = laundryTextField.text values["paymentCycle"] = paymentCycleTextField.text values["note"] = noteTextView.text values["owner"] = userID 

为我解决这个问题是使用键来设置字典值

 let dict: [string:any]() dict["key"] = "value" dict["key1"] = "value" dict["key2"] = "value" return dict 

如果你有一个很长的字典,它可能会或可能不会导致编译循环,从而导致编译时间过长。 任何超过8个键的东西都应该设置。