Xcode 挂在 "Compiling Swift source files"

Xcode hangs on "Compiling Swift source files"

我 运行宁 Xcode 7.3.1。在构建我的基于 Swift 的项目时,它挂在 "Compiling Swift source files" 上。我已经尝试了删除 DerivedData、清理、运行、重新启动 Xcode、重新启动 OS X、none 的各种组合似乎都有效。有什么想法吗?

尝试清理您的项目构建文件夹

  1. 按住 option 键并转到“产品”->“清理构建文件夹”(“清理”以前位于菜单中)
  2. 如果您使用的是 CocoaPods,请删除您的 Workspace 文件并 运行 Pod InstallPod Update

我认为 2 可能是原因。

感谢所有评论者的建议。我将其缩小到 map 的闭包引用我已删除的 属性。示例:

var people: [Person] = ...
let foo = people.map { "\([=10=].name), \([=10=].age)" }

其中 Person 看起来像:

protocol Person {
    var name: String { get }
    var age: Int { get }
}

一切正常。然后我删除了 age ,同时保持闭包不变。这导致 Xcode 变得无可救药地困惑。可能与 Swift 的类型推断有关。

在我的例子中,问题出在 JSON 解析期间。在 JSON 解析期间,我在字典参数中发送了一个可选值。

将构建设置中的 "Swift Compiler Optimization Level" 从 "Whole module optimization" 更改为 "Single file optimization"。这可能不是你的问题,但它解决了我卡了半天的问题。这可能只是最近 Xcode 版本中的一个临时错误(8.2.1 是我在写这篇文章时一直在使用的版本)。

我做了一个 class 扩展。这也会导致 Swift 编译器无错误地陷入循环:

class X: X

xcode 似乎在连接 5 个以上的字符串时出现问题。 看到这个: Xcode freezes when trying to execute this in a Swift playground? 给定的解决方法解决了我的问题

查看 Report Navigator 帮助我找到了问题所在。就我而言,问题是我试图将自动布局约束添加到 UITableViewController.

中以编程方式添加的 UITableView 子视图

在我的例子中 XCode 卡在大字典文字上:

requestParameters = [
                        "asset" : "...",
                        "user" : "...",
                        // about 15 additional keys
                        ]

将此部分替换为:

后问题已解决
var requestParameters = [String : Any]()
requestParameters["asset"] = "..."
requestParameters["user"] = "..."
// about 15 additional keys

我遇到了同样的问题。在我的例子中,这似乎是应用了太多 nil 合并操作的结果。我正在构建一个 json 项目:

json = [ "item1": value1 ?? "",
         "item2": value2 ?? "",
         "item3": value3 ?? "",
         ...
         "item14": value14 ?? "" ]

这不会编译。当我删除所有 nil 合并使其看起来像下面这样时,它编译正常。

json = [ "item1": value 1,
         "item2": value 2,
         "item3": value 3,
         ...
         "item14": value 14 ]

在卡住之前,我没有尝试找出项目数量的分界点。

编译时间过长似乎有多种可能的原因。角落或边缘案例无处不在。所以最好的办法就是观察和调查自己的情况。

虽然在评论中被其他人提及,但以下步骤仍值得多加注意:

  1. 运行 项目
  2. 切换到 Report Navigator(命令 + 9),select 当前 运行 Build 任务。看看哪个源文件占用编译时间多
  3. 检查该源文件的最近提交历史。调查可能的原因。

所以我认为在大多数情况下这是众所周知的字典字面量类型干扰问题。

这样的代码:

 let params = [
                "title": title, "desc": desc, "velikost": velikost,
                "cena": cena, "vykon": vykon, "telefon": telefon,
                "rokVyroby": rokVyroby, "stkDo": stkDo,
                "zemePuvodu": zemePuvodu, "najetoKilometru": najetoKilometru,
                "stav": stav, "ZnackaId": znackaId,
                "VyrobceId": vyrobceId,
                "category": categoryId, "subCategory": subCategoryId,
                "modely[]": modelId, "prodejNakup": prodejNakup,
                "mena": mena, "isNovy": isNovy, "serviska": serviska,
                "abs": abs, "technicak": technicak,
            ]

一定要这样写比较好:

let params: [String: String] = [
                "title": title, "desc": desc, "velikost": velikost,
                "cena": cena, "vykon": vykon, "telefon": telefon,
                "rokVyroby": rokVyroby, "stkDo": stkDo,
                "zemePuvodu": zemePuvodu, "najetoKilometru": najetoKilometru,
                "stav": stav, "ZnackaId": znackaId,
                "VyrobceId": vyrobceId,
                "category": categoryId, "subCategory": subCategoryId,
                "modely[]": modelId, "prodejNakup": prodejNakup,
                "mena": mena, "isNovy": isNovy, "serviska": serviska,
                "abs": abs, "technicak": technicak,
            ]

但我相信更短的字面量是个问题,为了节省等待构建的时间,最好始终为字典字面量定义类型,这样编译器就不必自己找出答案,因为他显然很挣扎。 PS:我认为 apple 工程师在那里有一些严重的个人问题,他们不得不从 Jatbrains 雇佣一些人或者甚至是我 ;) 专注于重要的事情而不是浪费时间讨论 Swift与众不同...

我发现 RoystonP 在 https://forums.developer.apple.com/thread/115303 上发表的 post 很有用:

1. Open Activity Monitor.
2. Start your project building.
3. Wait for the the build’s progress to completely stop for several minutes.
4. Locate the Swift processes in Activity Monitor (they should be using nearly 100% CPU) and select one of them.
5. In the menu bar, select “View”, then “Send Signal To Process…”
6. Select “Abort (SIGABRT)” from the drop-down list.
7. Click the “Send” button. This will simulate an assertion failing, so the compiler will print information about what it’s doing and then exit.
8. In Xcode, switch to the Report Navigator (the “speech bubble” button over the left-side pane) and select the build.
9. Scroll down to the now-failed compilation step and click the transcript button (button with five lines, to the right of the “Compile [Filename]” line).
10. Scroll down to see the diagnostic information. It will probably include a list of command-line flags, a few lines saying things like “In pass SimplifyCFG”, and a stack trace.


您可能需要重复第 6 步和第 7 步才能使其正常工作。

我遇到的错误是 The compiler is unable to type-check this expression in reasonable time; try breaking up the expression into distinct sub-expressions

我在这里漏掉了一个左箭头。