Xcode 8.0をインストールし、Swift 2.2を3.0に変換しました(そのプロセスにも多くの時間がかかりました。Macを一晩中実行したままにしました)。大きなプロジェクトはありません(約20ファイル)。 Pods
も使用しています。以前のXcodeバージョン(<8.0)のインデックス作成は高速で機能していましたが、アップグレード後、進行状況バーが1つの位置で止まっています(既に1時間待機しています)。
私が試したことは私を助けませんでした:
DerivedData
フォルダーをクリーンアップし、Xcodeを再起動しました<project>.xcworkspace
でPods
ディレクトリを削除してから、再度インストールしました開発者がこのようなばかげた問題の解決に何時間も費やす必要がある場合、ソフトウェアのリリースを行うのは本当にクールではありません。とても残念です。これを修正する方法はありますか?
すべてのファイルにコメントを付けてから、コメントを1つずつ削除することで問題を解決しました。 here のように、問題はまだ配列宣言にあることがわかりました。
私はこのようなコードを持っていて、プロジェクトはインデックスを作成していませんでした:
class {
var first: String!
var second: String!
var third: String!
var fourth: String!
var fifth: String!
func abc() -> [String] {
var array = [first, second, third, fourth, fifth]
}
}
私はこれをこれに変更し、インデックス作成が機能し始めました:
class {
var first: String!
var second: String!
var third: String!
var fourth: String!
var fifth: String!
func abc() -> [String] {
var array = [first]
array.append(second)
array.append(third)
array.append(fourth)
array.append(fifth)
}
}
プロジェクト設定に移動し、[エディター]> [ビルド設定の追加]> [ユーザー定義設定の追加]に移動し、次を追加します。
Swift_WHOLE_MODULE_OPTIMIZATION = YES
このフラグを追加すると、40KLOC Swiftプロジェクトのクリーンビルドのコンパイル時間が7分から65秒に奇跡的に短縮されました。また、2人の友人がエンタープライズプロジェクトで同様の改善を見たことを確認できます。
私はこれがXcode 8.0の何らかのバグであるとしか推測できません
Swift 3/XCode 8にアップグレードしてから同じ問題が発生しましたが、これは大きな配列リテラルが原因のようです。
配列リテラルに割り当てられている変数に型注釈を追加することで問題を修正できました。
let array: Array<String> = ["1", "2", "3", "4", "5", "6", "7", "8"]
の代わりに
let array = ["1", "2", "3", "4", "5", "6", "7", "8"]
私は同様の問題を抱えていて、このガイドに従ってデバッグしました: http://irace.me/Swift-profiling 私の問題は、たとえば文字列:
let name = "\(someString ?? "")"
また、これを使用した4つの方法により、構築時間が2分長くなりました。
私は同じ問題を抱えて、コードを一行一行丹念に調べて解決しましたが、Swift 3は+記号を使用するよりも文字列の補間を好むことがわかりました。
let url = "http://yahoo.com" + "someWebPage" + "whereItsInteresting"
上記のスタイルのコードを使用している場合は、次のコードに置き換えます。
let url = "http://yahoo.com\(someWebPage)\(whereItsInteresting)"
そして、ビルド時間はすぐに通常に戻ります。
コンパイラが「キャッチ」された場所を見つけたい人向け
Other Swift Flags
-Xfrontend -warn-long-function-bodies=50
に追加
完全な回答を確認してください こちら
コンパイルするのに1分以上かかった関数があり、いくつかの調査の後、犯人が保存された日付から十分な時間が経過したかどうかをチェックしていることがわかりました。
let myStoredDate: Double = // Double representing a time in the past
// if at least one week (60 * 60 * 24 * 7 seconds) has passed since myStoredDate
if Date().timeIntervalSince1970 - myStoredDate > (60 * 60 * 24 * 7){
// do stuff
}
このコードはコンパイルに10秒以上かかります。このコードが異なる番号で複数回繰り返されると相まって、コンパイルに時間がかかりすぎていました。間隔を事前計算することでこれを修正できました
let myStoredDate = // Double representing a time in the past
//it is important to explicitly specify that the variable is a Double
let interval: Double = 60 * 60 * 24 * 7
if Date().timeIntervalSince1970 - myStoredDate > interval{
// do stuff
}
私がチェックしていた〜10回でこれを行った後、コンパイル時間は1分以上から数ミリ秒に短縮されました。
この問題は、他の場所で型推論と数学の組み合わせでも発生する可能性が非常に高いため、コード内のどこでもこのようなことが起こらないようにしてください。
これがOPの問題に関連しているとは思わないが、私にとってXCode 8は最近停滞した。私は最終的にそれが私の間違いであることがわかりました(そして、誤ってそれを行ったことを覚えています)-私はXCode.appをフレームワーク参照として追加しました。これにより、本質的にXCode検索とXCode.appフォルダー全体のインデックス作成が行われました。間違いを見つけてフレームワークを削除すると、再びうまくいきました:)
私の問題は辞書でした。私はさまざまな大きな辞書を持っていました。
let values = ["address":addressTextField.text,"city":cityTextField.text,"zipCode":zipCodeTextField.text,"state":stateTextField.text,"pet":answerLabel.text,"rentStart":rentStartTextField.text,"rentEnd":rentEndTextField.text,"rent":rentTextField.text,"phone":phoneTextField.text,"email":emailTextField.text,"status":leaseStatusTextField.text,"bedrooms":bedroomTextField.text,"parking":parkingLabel.text,"furnish":furnishLabel.text,"utilities":utilitiesTextField.text,"laundry":laundryTextField.text,"paymentCycle":paymentCycleTextField.text,"note":noteTextView.text]
私はそれを分解しました:
var values = ["address":addressTextField.text]
values["city"] = cityTextField.text
values["zipCode"] = zipCodeTextField.text
values["state"] = stateTextField.text
values["pet"] = answerLabel.text
values["rentStart"] = rentStartTextField.text
values["rentEnd"] = rentEndTextField.text
values["rent"] = rentTextField.text
values["phone"] = phoneTextField.text
values["email"] = emailTextField.text
values["status"] = leaseStatusTextField.text
values["bedrooms"] = bedroomTextField.text
values["parking"] = parkingLabel.text
values["furnish"] = furnishLabel.text
values["utilities"] = utilitiesTextField.text
values["laundry"] = laundryTextField.text
values["paymentCycle"] = paymentCycleTextField.text
values["note"] = noteTextView.text
values["owner"] = userID
同じインデックスの問題が発生しましたが、デバイスで実行/デバッグしてから、左上のツールバー(ターゲット> iPhone)で別のデバイスに切り替えたときにのみ発生しました。
上記の解決策はどれも私にとってうまくいきませんでした。
私の解決策:ローカルgit作業コピーを削除し、「Origin」から新しいコピーを複製しました。
(xcuserdata/shared/sessionなどのフォルダー内に、この問題を引き起こした可能性のある「マジック」ファイルがありますか?)
プロジェクトをバックアップし、バックアップ後に最後の更新プロジェクトを削除してから、Xcode simpleを再起動します:-)
これはXcodeのバグ(Xcode 8.2.1)であり、大きな辞書リテラルまたはネストされた辞書リテラルがある場合に発生します。辞書を小さなパーツに分割し、Appleがバグを修正するまでappendメソッドで追加する必要があります。
これは、Xcode 8.2.1およびSwift 3で「インデックス作成」がスタックしている場合に機能します。
私は常に2つのプロジェクト、ダミープロジェクトと作業中のプロジェクトを開いています。また、プロジェクトを実行するiPad Airデバイスが接続されています。プロジェクトが「インデックス作成」で停止した場合、ダミープロジェクトに切り替えて、接続されているiPad Airデバイスでプロジェクトを実行します。次に、プロジェクトを停止し、作業中のプロジェクトに戻ります。「インデックス作成」は魔法のように終了します。これは、物理デバイスが接続されていない場合にのみシミュレーターでも機能するはずです。
設定を追加した後、
Swift_WHOLE_MODULE_OPTIMIZATION = YES
650 Swiftファイルの1200〜180秒のクリーンビルドコンパイル時間。ただし、これにより、コンパイルが失敗します。コンパイルの増加に60秒しか必要ない場合、すべての変更にはコンパイルに180秒が必要です。