it-roy-ru.com

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

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

10
Steve Kuo

Спасибо за предложения всех комментаторов. Я сузил его до закрытия 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 стал безнадежно запутанным. Вероятно, связано с выводом типа Свифта.

7
Steve Kuo

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

class X: X
14
Hai

Измените «Уровень оптимизации компилятора Swift» в настройках сборки с «Оптимизация всего модуля» на «Оптимизация отдельного файла». Возможно, это не твоя проблема, но она решила мою, с которой я застрял на полдня. Это может быть просто временная ошибка в последней версии XCode (8.2.1 была той, которую я использовал во время написания этой статьи).

5
KutakMir

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

  1. Удерживая нажатой клавишу выбора, вы попадаете в Product -> Clean Build Folder (где в меню раньше была Clean)
  2. Если вы используете CocoaPods, удалите файл рабочей области и запустите Pod Install или Pod Update

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

5
Mobile Bloke

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

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

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

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

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

4
Jeff Evernham

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

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

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

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

2
Swati Gupta

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

1
Tamás Sengel

В моем случае XCode привязан к большому словарному литералу:

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

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

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

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

Код как это:

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

0
Renetik

кажется, в xcode есть проблема с конкатенацией более 5 строк. Смотрите это: Xcode зависает при попытке выполнить это на игровой площадке Swift? Данный обходной путь решил мою проблему

0
Werner Kratochwil