101

也许这只是我遇到了这样一个烦人的“功能”:

从 Xcode 6.0.1 升级到 Xcode 6.1 后,情况发生了变化。Xcode 6.1 一直在为项目编制索引或编译源文件。这个项目不是一个大项目。它只在工作区中包含一堆 Swift 文件和 AWS SDK 2.0 Cocoapods。我认为它不应该阻止整个索引和顺利编译。我尝试了一些 aws-sdk-ios-samples,只是想看看 Xcode 6.1 是如何在它们上工作的,结果却是永远等待。

到目前为止我尝试了哪些解决方案:

  1. 删除管理器中的“派生数据”,重新打开工作区。(无法修复)
  2. .xcodeproj 文件上的“显示包内容”并删除 .xcworkspace,如(Xcode 4 - 性能缓慢

不幸的是,他们都没有工作。

PS也许我应该尝试重新创建项目?我的电脑设置:MacBook Pro(Retina,13 英寸,2014 年中),内存 8 GB 1600 MHz DDR3,带有 Yosemite。(我认为这足以运行这个小项目。)

4

25 回答 25

72

我尝试了上面的许多建议,包括拆分文件、安装 Xcode 6.2 beta 和破坏字符串连接语句。最终为我做的是将用于测试数据的字典文字声明数组拆分为多个.append语句。

// This causes indexing/building to hang...
var test = [ [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ],
             [ "a": false, "b": "c" ] ]

// This works fine.
var test = [ [ "a": false, "b": "c" ] ]
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])
test.append([ "a": false, "b": "c" ])

此外,对于它的价值,这个数组中的第 6 个条目是导致我出现问题的原因;五个作品就好了。

于 2014-12-17T17:29:03.493 回答
35

对我来说唯一可行的解​​决方案是删除所有派生数据(不仅针对当前项目,只需清理整个文件夹),然后重新启动 Xcode。

  1. 在 Xcode 中打开文件/首选项

  2. 单击弹出窗口最右侧的位置

  3. 单击“/Users/Mac/Library/Developer/Xcode/DerivedData”旁边的小箭头图标......它会将您带到包含 DerivedData 文件夹的 Xcode 文件夹(包含您以前项目的所有派生数据.)

  4. 删除 DerivedData 文件夹

于 2015-02-20T15:17:02.477 回答
11

你在使用 CocoaPods 吗?我今天早些时候遇到了同样的问题。(使用 xCode 6.1.1)

为了解决这个问题,我删除了项目目录中~/Library/Developer/Xcode/DerivedData的文件夹和.Pods<project>.xcworkspace

然后我打开终端,导航到我的项目目录,然后pod install再次运行。

于 2015-01-05T15:57:53.987 回答
9

今天有同样的问题。Xcode 6.3.2,中型 Swift 项目。在某一时刻,它开始索引并且永远不会完成索引。导致这种情况的代码是一个 [String:[String]] 类型的字典,因此是一个以字符串数组作为值的字符串键字典。我有两个从 A 到 Z 的键,这 26 个条目中的每一个都包含一个包含 5 到 10 个字符串的字符串数组。

清除派生数据没有帮助。只有注释掉那些 dicts 才能让它再次运行。

老实说,这太荒谬了!苹果需要修复 Xcode!编译 Swift 项目时它已经非常慢了,但是像这样的错误是一个障碍。我不能用这个正确地完成我的工作!

于 2015-05-27T03:32:46.657 回答
6

对于那些仍然有这个问题的人,这是我喜欢的一种解决方法,它可以防止你不得不一个一个地输入对象:

// instead of this, which freezes indexing
let keys = [keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM]    

// and instead of this, which is ugly & lengthy
var keys = [KeyboardKey]()
keys.append(keyQ)
keys.append(keyW)
...
keys.append(keyM)

// use this:
var keys = [KeyboardKey]()
keys.appendContentsOf([keyQ, keyW, keyE, keyR, keyT, keyY, ... keyM])
于 2015-10-28T15:59:03.447 回答
5

对我来说,我尝试了以上所有方法都没有成功;但我所要做的就是删除派生数据文件夹,然后打开另一个随机项目,等待它建立索引,现在我原来的(故障)项目工作了!

帮助开发世界,让你的 swift 编译器开源——这样我们就不会因为你的无能而受挫。

于 2015-04-07T10:57:13.397 回答
3

我正在使用 Xcode 版本 7.3 (7D175)

我想我可能已经发现了一个潜在的问题。有两个我陷入索引阶段的情况:

  • 我创建了一个分配给变量的闭包并省略了类型签名。我认为 xcode 在该类型推断步骤方面存在问题。如果我没记错的话,其中一个参数是一个 CGPoint,它有一个重载的构造函数。我的假设是,我的闭包可能会接受太多的可能性作为论据。

  • 我重构了一个工厂方法,这样它就可以返回具有公共基类的多种类型的实例,而不是返回一种类型的实例。看来,无论我在哪里使用工厂方法,我都必须将结果对象转换为特定类型(使用 as? 或通过将其分配给接受特定类型的变量)再次,类型推断步骤似乎被破坏了。

似乎早期个人提到的字典声明也是如此。我向苹果提交了一份错误报告。

于 2016-04-02T17:05:13.347 回答
2

在我的 Xcode 上,解决方案是关闭所有冗余窗口。出于某种原因,许多打开的窗口使 Xcode 非常慢。

于 2015-01-12T10:32:01.170 回答
2

升级到 6.1 后,我遇到了同样的问题。Xcode 会在不生成特定错误消息的情况下陷入编译或索引。

通过将 swift 文件中的一些较长的表达式分解为多个较短的表达式,最终解决了该问题。我的程序的一部分结合了许多不同的字符串变量来形成一个更长的字符串。尝试将它们组合在一个表达式中并使用加法赋值运算符都失败了。我能够通过执行类似于以下(简化)的操作来使其工作:

var a = "Hello"
var b = " "
var c = "World"
var d = "!"
var partA = a + b
var partB = c + d
var result = partA + partB

我是从以前的 Xcode 版本中多次收到以下错误得到这个想法的:“表达式太复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式。”

希望这可以帮助

于 2014-10-23T03:56:23.323 回答
2

我一直在努力解决同样的问题。我已经尝试了提到的两种解决方案(删除派生数据和删除 .xcworkspace )但没有成功。我还尝试一点一点地慢慢注释掉大部分代码并删除文件,直到几乎什么都没有并且索引仍然卡住。

我确实找到了一个对我有用的解决方案,我用旧的 Xcode 版本 6.1 (6A1030) 打开了项目,它没有索引问题,然后回到我之前使用的最新的 Xcode 版本 6.1 (6A1052d),索引是修复并继续正常工作。

我的结论是,这是 Xcode 版本 6.1 (6A1052d) 的一个错误,我希望在未来的版本中会有所改进。

问题确实偶尔会再次出现,每次都使用相同的修复程序。我猜另一种解决方案是坚持使用较旧的 Xcode 版本 6.1 (6A1030),但它不适用于运行 iOS 8.1 的设备,并且它不会有最新的错误修复。

于 2014-11-04T09:34:01.887 回答
2

Xcode 11.5 (11E608c) 仍然是同样的问题,在最初的问题之后 6 年。我希望我可以在这个问题中“标记”苹果,这样他们就可以看到这个烂摊子。这是一个大型项目(> 1000 个文件),我在时钟下,所以当我注意到冻结索引时,我更改了 100 多个文件并且无法返回。

我已经尝试了一切:

  1. 清除派生数据并构建
  2. 重启xcode,重启mac
  3. 删除和添加源
  4. 搜索字典文字等

问题是数组创建:

private var overlayColors: [UIColor] = [UIColor(hex: "#b71c1c"), UIColor(hex: "#4a148c"),
                                        UIColor(hex: "#880e4f"), UIColor(hex: "#1de9b6"),
                                        UIColor(hex: "#f50057"), UIColor(hex: "#311b92"),
                                        UIColor(hex: "#f44336"), UIColor(hex: "#651fff"),
                                        UIColor(hex: "#d500f9"), UIColor(hex: "#3d5afe"),
                                        UIColor(hex: "#bf360c"), UIColor(hex: "#0d47a1"),
                                        UIColor(hex: "#006064"), UIColor(hex: "#2979ff"),
                                        UIColor(hex: "#ff6f00"), UIColor(hex: "#1a237e"),
                                        UIColor(hex: "#795548"), UIColor(hex: "#004d40"),
                                        UIColor(hex: "#00e676"), UIColor(hex: "#01579b"),
                                        UIColor(hex: "#33691e"), UIColor(hex: "#827717"),
                                        UIColor(hex: "#76ff03"), UIColor(hex: "#ffc400"),
                                        UIColor(hex: "#e65100"), UIColor(hex: "#00b0ff"),
                                        UIColor(hex: "#ff3d00"), UIColor(hex: "#616161"),
                                        UIColor(hex: "#263238"), UIColor(hex: "#ff1744")]

帮助我发现坏 swift 文件的是当 xcode 冻结索引时,我执行了以下步骤

  1. 打开活动监视器->“swift”进程->显示进程信息->打开文件和端口。这将为您提供此进程正在运行的文件的列表,深入了解可能的坏文件列表
  2. 另一个方便的工具是这个脚本SOURCEKIT_LOGGING=3 /Applications/Xcode.app/Contents/MacOS/Xcode &> ~/Documents/xcode.log,它将以 3 级详细启动 Xcode 并开始记录日志文件。
  3. 在日志文件中搜索您的 swift 文件的最后条目,例如: “my_project/Source/App/”

这不是一个完整的解决方案,但它有助于深入了解并知道在哪里寻找。

打开活动监视器->

于 2020-07-11T11:39:49.903 回答
2

我已经用 Xcode 8.3.3 试过了。这是我的结果:

你可以编写完美的 Swift 代码,这会导致索引挂起。

一旦索引挂起,它就会挂起。将 Swift 代码改回不会导致索引挂起的东西没有帮助,它仍然挂起。

在这种情况下,关闭项目并重新打开并没有帮助。

退出 Xcode 并重新启动它会有所帮助。索引将不再挂起(也就是说,如果您将代码更改回不会使其挂起的内容)。

重新启动 Mac 也有帮助,尽管它不是必需的。

挂起是由完美的 Swift 代码引起的。我看起来像的一个例子

if let date = function1()
?? function2()
?? function3()
?? function4()
?? function5()
?? function6()
?? function7()
?? function8()
?? function9()
?? function10() {
    return date
}

索引会挂起。我注释掉了大部分“??” 行,它很好(退出并重新启动 Xcode 之后)。一行一行地取消注释。有一些行很好,然后取消注释下一行会使其挂起。

唯一有帮助的显然是更改您的代码。

于 2017-07-03T13:16:11.237 回答
1

最后,我“解决”了这个问题,尽管它只是一种解决方法。

我创建了另一个项目并一个一个地添加了文件。然后我发现了一个“很长”的 viewcontroller.swift 文件。然后我把它的代码分解成模块,把那些重复使用的代码变成另一个 swift 文件中的函数。而且,我在网上接受了建议,长的表达应该被分解成更短的。然后,索引工作和编译工作。

所以现在,我已经“解决”了它。

但是,我认为这是不对的。Xcode IDE 应该能够处理我的“非常长”的 swift 文件,只有 1500 行。我相信这绝对是一个错误(存在很长时间),尽管 Xcode 6.1 已经是 Xcode 6.0.1 的升级版。

于 2014-10-23T12:45:58.520 回答
1

对我来说,我删除了 Xcode 应用程序并再次下载并安装它。这解决了这个问题,至少现在是这样。

于 2014-11-12T23:55:43.923 回答
1

Xcode 索引通常为您的代码提供建议和自动完成功能,例如在故事板中帮助您,反之亦然。但是为了使您的 xcode 项目更快,您可以通过终端将其关闭/打开

关闭索引
默认值 write com.apple.dt.XCode IDEIndexDisable 1 打开索引默认值 write com.apple.dt.XCode IDEIndexDisable 0

但是更好的方法是使用具有良好 RAM 的快速 mac。

于 2016-11-17T05:40:26.300 回答
0

如果您不介意在他们弄清楚之前恢复到 6.0.1,那么这对我有用。我在 6.1 和 6.1.1 上都遇到了同样的问题。现在我很好。6.2出来的时候我试试。

你可以在他们的官方开发网站上找到以前版本的苹果软件,这里: https ://developer.apple.com/downloads/index.action

如果您这样做,请确保首先删除您当前的 Xcode 副本。

于 2014-12-12T17:25:51.903 回答
0

Xcode 6.2 beta 为我解决了这个问题。不是闪电般快速,但至少它不会永远索引。Beta 版不会安装在常规 Xcode 安装之上,因此如果您不喜欢该 Beta 版,您可以将其删除。

各种 Xcode 下载,包括测试版 >

于 2014-11-26T16:44:25.867 回答
0

我也遇到过这个问题,并通过使用“+”运算符删除/更改表达式来解决它。

我改变了这个:

var mainArray = arrayOne + arrayTwo + arrayThree + arrayFour + arrayFive

对此:

var mainArray = arrayOne
mainArray += arrayTwo
mainArray += arrayThree
mainArray += arrayFour
mainArray += arrayFive

它解决了这个问题。

我的机器是 2013 年底的最大 MBP

于 2014-11-12T19:09:44.460 回答
0

我在同一台 MacBook Pro 上使用带有 swift 文件的 Xcode 6.1.1。

当我不断向 3D 字符串数组中添加行时,Xcode 突然变得无法使用,现在我什么也做不了。

将尝试恢复到 6.1,希望问题会消失。

于 2015-01-07T20:58:16.930 回答
0

您可能希望更新到 Xcode 6.1.1

它已经正式发布并为我们解决了索引问题。在更新描述中,它说他们已经应用了稳定性修复程序,因此它很可能会以更稳定的方式运行。

于 2014-12-03T14:18:00.873 回答
0

我在 Xcode 6.3.2 中看到了这一点。我真的希望在发布一年后,他们会让编译器工作,但是唉。

如果上述解决方案都不适用,请尝试检查您的代码是否存在语法错误。在重构的过程中,我提取了一个闭包但忘记限定参数:

    let hangsInsteadOfError = { l, r in
        return l.nameFirst < r.nameFirst
        || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

    let fixingErrorAvoidsHang = { (l:User, r:User) -> Bool in
        return l.nameFirst < r.nameFirst
            || l.nameFirst == r.nameFirst && l.nameLast < r.nameLast }

如果我从 Swift 工作中学到了什么,那就是渐进式地工作,以避免为了找到有问题的代码而不得不回溯太多。

于 2015-06-01T18:35:36.267 回答
0

我使用 Xcode 8.2 也以这个问题告终。它是在我定义了一个复杂的元组变量之后开始的——一个带有元组子数组的元组数组。当元组的子数组具有以编程方式计算的属性时,事情变得非常缓慢。

正如其他一些答案所指出的,索引需要永远,我相信它试图推断变量的类型。

我首先通过明确定义包含类型的变量来解决问题。更新属性时,我先计算它然后将其分配给元组,而不是在定义变量时计算。

这是一个示例代码。

var sectionTuples: [(section: String, rows: [(name: String, subtitle: String)])] = []
let subtitle1: String = "" // something calculated dynamically
let subtitle2: String = "" // something calculated dynamically
sectionTuples = [(
section: "Section 1", rows: [
(name: "name1", subtitle: subtitle1),
(name: "name2", subtitle: subtitle2)
])]

底线是不要让 Xcode 推断复杂的结构。

于 2017-02-08T22:35:50.090 回答
0

我有这样的表达:

let x = (value as? Int) ?? someDefault

guard let x = (dateFormatter().string(from: Date()) + msg + "\n").addingPercentEncoding(...) else { ... }

所以重点是重写您的文件以仅包含幼儿园级别的表达式,并且索引问题将消失。

于 2020-02-13T13:37:03.373 回答
0
  1. 您的索引状态是“指标圈”还是“进度条”?
  2. 如果是“指标圈”,说明一开始就卡住了。
  3. 打开并检查您的其他项目,如果它们都相同,则表示这是系统问题。
  4. 只需重新启动计算机,一切都会好起来的。
于 2016-10-01T02:08:55.123 回答
0

我遇到了同样的问题。我的 Xcode 是 8.2.1。但就我而言,我想创建一个包含 33 个键值对的字典数组。我正在按照以下方式进行索引:

var parameter = [String : AnyObject]()
var finalArray = [parameter]

for item in listArray
{
    parameter = ["A": item.a as AnyObject, "B": item.b as AnyObject, "C": item.c as AnyObject, ... , "Z": item.z as AnyObject]

    finalArray.append(parameter)
}

以下为我工作:

var parameter = [String: AnyObject]()
var finalArray = [parameter]

for item in listArray
{
    parameter["A"] = listArray.a as AnyObject
    parameter["B"] = listArray.b as AnyObject
    parameter["C"] = listArray.c as AnyObject
    parameter["D"] = listArray.d as AnyObject 
    .
    .
    .
    parameter["Z"] = listArray.z as AnyObject 
    finalArray.append(parameter)
}
于 2017-03-17T18:10:49.013 回答