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

时间:2016-11-05 17:08:20

标签: xcode compiler-errors swift3 xcode8.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
        ]
    }
}

3 个答案:

答案 0 :(得分:2)

在没有大字典文字的情况下重写。所以:

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

答案 1 :(得分: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

答案 2 :(得分:0)

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

您正在制作字典文字并且不提供类型信息。明确地使用" as"可以帮到很多。

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

尽量不要混淆编译器。