Xcode 8.1 swift 3 永远编译这段代码

Xcode 8.1 swift 3 take forever to compile this code

我在以前使用 swift 2.3 的项目中有这个 class。当我将项目迁移到 swift 3 时,xcode 花了很长时间才编译,我看到它卡在了这个 class。由于这个 class,我无法构建整个项目。有没有办法修改这个 class 以便可以构建项目,编译这段代码花了 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
        ]
    }
}

如果您还没有这样做,那么在您的项目中添加一个 -Xfrontend -debug-time-function-bodies 编译器标志将列出编译每个函数所需的时间。这可能是一种有用的方法来确定您的构建中到底是什么慢了。 (参见 http://irace.me/swift-profiling or https://thatthinginswift.com/debug-long-compile-times-swift/)。

在你的情况下,编译器可能正在努力确定你的字典文字的类型。查看每个键和值,然后尝试为所有键和值找到最合适的通用类型。如果您指定了一个类型,那么我希望编译器只需要验证您的文字是否匹配该类型并更快地编译:

let result: [String: Any] = ["id": id, ...]
return result

不用大字典字面量重写。所以:

func toAnyObject() -> Any {
    var d = [String:Any]()
    d["id"] = id
    d["uid"] = uid
    // ... and so on ...
    return d
}

有时,当您进行隐式键入时,编译器会变慢。如果您显式添加类型信息,则编译器将不需要计算它。我可以看到你的 class 的属性大部分都有类型信息,但不是全部。在您的 toAnyObject 方法中,您似乎希望将对象表示为字典,但您正在将其转换为 Any 类型。

您正在制作字典字面量并且不提供任何类型信息。使用 "as" 显式转换会有很大帮助。

当您将某些内容转换为 Any 类型时,Objective-C 会将其解释为 id。通常,swift 字典会桥接到 Objective-c 的 NSDictionary,但您强制将其设为 Any 类型。编译器必须将其桥接到 NSDictionary 的原因是什么?它可能会将它装箱,因为它认为它是一个结构并且 objective-c 不能使用 swift 结构。

尽量不要混淆编译器。