web-dev-qa-db-ja.com

Xcodeが「コンパイルSwiftソースファイル」でハングする

Xcode 7.3.1を実行しています。私のSwiftベースのプロジェクトをビルドすると、「Swiftソースファイルのコンパイル」でハングアップします。DerivedDataを削除するさまざまな組み合わせを試しましたクリーン、実行、Xcodeの再起動、OS Xの再起動、どれも動作しないようです。

14
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は絶望的に混乱しました。おそらくSwiftの型推論に関連しています。

7
Steve Kuo

クラスを拡張しました。また、Swiftコンパイラーがエラーなしでループでスタックするようになります。

class X: X
19
Hai

ビルド設定の「Swiftコンパイラ最適化レベル」を「モジュール全体の最適化」から「単一ファイルの最適化」に変更します。それはあなたの問題ではないかもしれませんが、それは私が半日立ち往生していた私のものを解決しました。最近のXcodeバージョンの一時的なバグである可能性があります(8.2.1は、これを書いたときに使用していたものです)。

6

プロジェクトビルドフォルダーをクリーンアップしてみてください

  1. オプションキーを押したまま、[製品]-> [ビルドフォルダーのクリーンアップ]に移動します(以前はメニューに[クリーンアップ]がありました)
  2. CocoaPodsを使用している場合は、ワークスペースファイルを削除してPod InstallまたはPod Updateを実行します

おそらく2が原因だと思います。

6
UKDataGeek

コンパイル時間が非常に長くなるには、さまざまな原因が考えられます。コーナーまたはエッジのケースは至る所にあります。したがって、最善の方法は、自分のケースを観察して調査することです。

コメントで他の人から言及されていますが、以下の手順はまだもっと注目に値します:

  1. プロジェクトを実行する
  2. レポートナビゲーター(コマンド+ 9)に切り替え、現在実行中のBuildタスクを選択します。コンパイルに時間がかかっているソースファイルを確認します。
  3. そのソースファイルの最近のコミット履歴を確認してください。考えられる原因を調査します。
4
denkeni

私も同じ問題を抱えていました。私の場合、それはあまりにも多くの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 ]

スタックする前のアイテム数のカットオフポイントを把握しようとはしませんでした。

4
Jeff Evernham

私の場合、問題はJSONの解析中に発生しました。 JSON解析中に、オプションの値を辞書パラメーターで送信していました。

2
Swati Gupta

レポートナビゲーターを見ると、問題を見つけるのに役立ちました。私の場合、問題は、UITableViewUITableViewControllerのプログラムによって追加されたサブビューに自動レイアウト制約を追加しようとしたことでした。

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

私が便利だと思ったのは、RoystonPの https://forums.developer.Apple.com/thread/1153 の投稿でした。

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を繰り返す必要がある場合があります。

0
basvk

xcodeには、5つを超える文字列を連結する際に問題があるようです。これを参照してください: これをSwift playground? で実行しようとすると、Xcodeがフリーズします

0