Xcode 8.1 swift 3 take forever to compile this cod

2019-03-02 10:30发布

I have this class in a project which previously use swift 2.3. When i migrated the project to swift 3, xcode took forever to compile and i saw it stuck at this class. I can not build the whole project because of this class. Is there a way to modify this class so the project can be built, it took Xcode forever to compile this piece of code. If i removed several properties from MyClass, Xcode will quickly compile again. Anyone has any idea on how to solve this problem?

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
        ]
    }
}

3条回答
Viruses.
2楼-- · 2019-03-02 11:08

Rewrite without the big dictionary literal. So:

func toAnyObject() -> Any {
    var d = [String:Any]()
    d["id"] = id
    d["uid"] = uid
    // ... and so on ...
    return d
}
查看更多
ゆ 、 Hurt°
3楼-- · 2019-03-02 11:23

If you're not doing so already adding a -Xfrontend -debug-time-function-bodies compiler flag to your project will list the time required to compile each function. That can be a useful way to identify what exactly is slow in your build. (See http://irace.me/swift-profiling or https://thatthinginswift.com/debug-long-compile-times-swift/).

In your case the compiler is probably struggling to determine the type of your dictionary literal. Looking at each key and value and then trying to find the most appropriate common type for all of them. If you specified a type then I expect the compiler will only need to verify that your literal matches that type and compile much more quickly:

let result: [String: Any] = ["id": id, ...]
return result
查看更多
乱世女痞
4楼-- · 2019-03-02 11:31

Sometimes the compiler slows down when you do implicit typing. If you Explicitly add the type information then the compiler will not need to calculate it. I can see that the properties of your class mostly have type information but not all of them. In your toAnyObject method, it seems like you want your object represented as a dictionary, yet you are converting it to type Any.

You are making a dictionary literal and offering no type information. Explicitly casting with "as" can help a lot.

When you convert something to type Any, Objective-C interprets that as id. Normally a swift dictionary would be bridged to an NSDictionary for Objective-c, but you are forcing it to be of type Any. What reason would the compiler have to bridge this to an NSDictionary? It probably boxes it since it thinks it is a struct and objective-c can't use swift structs.

Try to not confuse the compiler.

查看更多
登录 后发表回答