1

以前にswift 2.3を使用していたプロジェクトにこのクラスがあります。プロジェクトをSwift 3に移行したとき、xcodeのコンパイルに永遠に時間がかかり、このクラスで動かなくなった. このクラスのため、プロジェクト全体をビルドできません。プロジェクトをビルドできるようにこのクラスを変更する方法はありますか? Xcode でこのコードをコンパイルするのに永遠にかかりました。MyClass からいくつかのプロパティを削除すると、Xcode はすぐに再びコンパイルされます。誰でもこの問題を解決する方法について何か考えがありますか?

import Foundation

class MyClass: NSObject {

    var id: String = ""
    var uid: String = ""
    var uname: String = ""
    var fname: String = ""
    var txt: String = ""
    var hay: Float = 0
    var flag = false
    var long: Double = 0
    var lat: Double = 0
    var altitude: Double = 0
    var course: Double = 0
    var speed: Double = 0
    var lname: String = ""
    var city: String = ""
    var country: String = ""
    var sublocal: String = ""
    var subarea: String = ""
    var thumb: String = ""
    var trash = false
    var date: Double = 0
    var updated: Double = 0
    var furl: String = ""

    func toAnyObject() -> Any {
        return [
            "id": id,
            "uid": uid,
            "uname": uname,
            "fname": fname,
            "txt": txt,
            "hay": hay,
            "flag": flag,
            "long": long,
            "lat": lat,
            "altitude": altitude,
            "course": course,
            "speed": speed,
            "lname": lname,
            "city": city,
            "country": country,
            "sublocal": sublocal,
            "trash": trash,
            "subarea": subarea,
            "thumb": thumb,
            "date": date,
            "updated": updated,
            "furl": furl
        ]
    }
}
4

3 に答える 3

0

まだそうしていない場合は-Xfrontend -debug-time-function-bodies、プロジェクトにコンパイラ フラグを追加すると、各関数のコンパイルに必要な時間が一覧表示されます。これは、ビルドで何が遅いのかを正確に特定するのに役立つ方法です。( http://irace.me/swift-profilingまたはhttps://thatthinginswift.com/debug-long-compile-times-swift/を参照してください)。

あなたの場合、コンパイラはおそらく辞書リテラルの型を判断するのに苦労しています。各キーと値を見て、それらすべてに最も適した一般的な型を見つけようとします。型を指定した場合、コンパイラはリテラルがその型と一致することを確認するだけでよく、コンパイルがはるかに速くなると思います。

let result: [String: Any] = ["id": id, ...]
return result
于 2016-11-05T18:00:21.217 に答える
0

暗黙的な型付けを行うと、コンパイラの速度が低下することがあります。型情報を明示的に追加すると、コンパイラはそれを計算する必要がなくなります。あなたのクラスのプロパティにはほとんどの型情報がありますが、すべてではないことがわかります。toAnyObject メソッドでは、オブジェクトを辞書として表現したいようですが、Any 型に変換しています。

辞書リテラルを作成しており、型情報を提供していません。「as」を使用して明示的にキャストすると、非常に役立ちます。

何かを Any 型に変換すると、Objective-C はそれを id として解釈します。通常、Swift ディクショナリは Objective-c の NSDictionary にブリッジされますが、強制的に Any 型にする必要があります。コンパイラがこれを NSDictionary にブリッジする必要があるのはどのような理由ですか? それは構造体であり、objective-c は迅速な構造体を使用できないと考えているため、おそらくそれをボックス化します。

コンパイラを混乱させないようにしてください。

于 2016-11-06T02:33:58.150 に答える