Xcode зависает на "Компиляция исходных файлов Swift"

Я запускаю Xcode 7.3.1. При создании моего проекта, основанного на Swift, он зависает на "Компиляция исходных файлов Swift". Я пробовал различную комбинацию удаления DerivedData, очистки, запуска, перезапуска Xcode, перезапуска OS X, ни один из них не работает. Любые идеи?

Ответ 1

Спасибо за предложения всех комментаторов. Я сузил его до закрытия map, ссылаясь на свойство, которое я удалил. Пример:

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

где Person выглядит примерно так:

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

Все это прекрасно работает. Затем я удалил age, сохраняя закрытие без изменений. Это привело к тому, что Xcode стал безнадежно запутанным. Вероятно, связано с выводом типа Swift.

Ответ 2

Я сделал класс, расширяющий себя. Это также заставляет компилятор Swift застревать в цикле без ошибок:

class X: X

Ответ 3

Попробуйте очистить папку сборки проекта

  • Удерживайте нажатой клавишу выбора и подключитесь к продукту → Очистить папку сборки (где в меню используется Clean)
  • Если вы используете CocoaPods, удалите файл рабочей области и запустите Pod Install или Pod Update

Я думаю, что 2, вероятно, является причиной.

Ответ 4

Измените "Уровень оптимизации Sweeper Compiler" в настройках сборки с "Оптимизация всего модуля" на "Оптимизация отдельных файлов". Возможно, это не ваша проблема, но она решила, что я застрял на полдня. Это может быть временной ошибкой в ​​недавней версии Xcode (8.2.1 был тем, который я использовал в то время, когда я это написал).

Ответ 5

У меня была та же проблема. В моем случае это, по-видимому, результат применения слишком большого количества коалиционных действий. Я создавал элемент json:

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

Это не скомпилируется. Когда я удалил все нисходящее объединение, чтобы оно выглядело следующим образом, оно скомпилировалось отлично.

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

Я не пытался определить точку отсечки для количества элементов, прежде чем она застряла.

Ответ 6

Кажется, существуют различные возможные причины чрезвычайно долгого времени компиляции. Угловые или крайние случаи есть везде. Так что лучший способ - это наблюдать и расследовать собственное дело.

Хотя упомянутое другими в комментариях, но шаги ниже все еще заслуживают большего внимания:

  1. Запустить проект
  2. Переключитесь на Report Navigator (команда + 9) и выберите текущую задачу Build. Посмотрите, какой исходный файл занимает много времени компиляции.
  3. Проверьте историю последних изменений этого исходного файла. Расследовать возможную причину.

Ответ 7

В моем случае проблема была во время разбора JSON. Я отправил необязательное значение в параметр словаря во время разбора JSON.

Ответ 8

Наблюдение за наложением отчета помогло мне найти проблему. В моем случае проблема заключалась в том, что я попытался добавить ограничения автоматической компоновки к программно добавленному представлению UITableView в UITableViewController.

Ответ 10

В моем случае XCode stucks на большом словарном литерале:

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

Проблема была исправлена ​​после замены этой части на:

var requestParameters = [String : Any]()
requestParameters["asset"] = "..."
requestParameters["user"] = "..."
// about 15 additional keys

Ответ 11

в моем случае я изменил

bookingPassengers.append(["paxType": passengersData[passIndex].travellerKind ?? " " ,
                                          "firstName": passengersData[passIndex].firstName ?? " "   ])

к

bookingPassengers.append(["paxType": passengersData[passIndex].travellerKind! ,
                                          "firstName": passengersData[passIndex].firstName!   ])

После этого все стало хорошо

Ответ 12

Поэтому я считаю, что в большинстве случаев это общеизвестный словарь буквального типа с помехами.

Код как это:

 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 должен отличаться от других...

Ответ 13

Я удалил репозиторий git, затем отозвал его, казалось, чтобы решить проблему