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

2

重写没有大字典文字。所以:

func toAnyObject() -> Any {
    var d = [String:Any]()
    d["id"] = id
    d["uid"] = uid
    // ... and so on ...
    return d
}
于 2016-11-05T19:10:16.917 回答
0

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

您正在制作字典文字并且不提供类型信息。用“as”显式转换可以有很大帮助。

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

尽量不要混淆编译器。

于 2016-11-06T02:33:58.150 回答
0

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

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

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