Xcode 继续在 Swift 3 上构建

Posted

技术标签:

【中文标题】Xcode 继续在 Swift 3 上构建【英文标题】:Xcode keeps building on Swift 3 【发布时间】:2016-09-28 08:14:25 【问题描述】:

我已经将我的 Swift 2.3 项目转换为 swift 3。现在编译器不再抛出任何错误,但它会继续编译。 CPU 就像 100% 一样,如果你不停止它,它会持续编译 50 分钟或更长时间。

Xcode 一直在说 Building .. |编译 Swift 源文件

在构建日志中,它总是在相同的 swift 文件上停止。 swift 文件只是简单的模型类,所以我不知道可能是什么问题。

我在 swift 2 中遇到了同样的问题,但这是由 ?? 运算符引起的。我重构了代码以删除 ?? 运算符,所以它不能再这样了。

如何找出导致编译时间变慢的原因?

我的模型看起来都一样:

class Test: InputContract 
    var appointmentDate: Date!
    var startTime: String!
    var endTime: String!
    var registerDescription: String!
    var subjectKey: String!
    var channelCode: String!
    var relationManagerHrId: String = ""
    var employeeUserCode: String = ""
    var smsReminderMobileNumber: String = ""
    var smsReminderMobileNumberSequence: String!
    var contactPhoneNumber: String = ""
    var contactPhoneNumberSequence: String!
    var smsReminder: Bool = false

 override func retrieveInputDictionary() -> NSDictionary 
        return ["description" : self.registerDescription, "appointmentDate" : Utils.formattedDate(self.appointmentDate),
                "startTime" : self.startTime, "endTime" : self.endTime, "subjectKey" : self.subjectKey, "channelCode" : self.channelCode, "smsReminder" : self.smsReminder ? "true" : "false", "relationManagerHrId" : self.relationManagerHrId, "employeeUserCode" : self.employeeUserCode,
                "smsReminderMobileNumber" : self.smsReminderMobileNumber, "contactPhoneNumber" : self.contactPhoneNumber, "smsReminderMobileNumberSequence" : self.smsReminderMobileNumberSequence, "contactPhoneNumberSequence" : self.contactPhoneNumberSequence
        ]
    

输入合同是:

protocol InputDictionaryMapper 
    func retrieveInputDictionary() -> NSDictionary
    func retrievePublicInputDictionary() -> NSDictionary


class InputContract: Model, InputDictionaryMapper 

    func retrieveInputDictionary() -> NSDictionary 
        fatalError("Each inputContract implementation must implement it's own method: \(NSStringFromClass(type(of: self)))")
    

    func retrievePublicInputDictionary() -> NSDictionary 
        fatalError("Each inputContract implementation must implement it's own method: \(NSStringFromClass(type(of: self)))")
    

    required init(json: JSON) 
        fatalError("init(json:) has not been implemented")
    

    override init() 
        super.init()
    

model 只是一个基类,它也有另一个用于 json 的 init。

当我在构建日志上运行分析器时,我的所有模型都需要很长时间才能创建 NSDictionary。但是为什么呢?

【问题讨论】:

1.您是否尝试过清理项目/重新启动 Xcode/等? 2. 你有没有试过在一个单独的项目中编译这个 Swift 文件?如果没有,请发布它所挂的 Swift 文件的内容。 你好,我也有同样的问题,你有解决办法吗? @fiks 我在课堂上编辑了我的问题。 这可能是类型推断的问题。您能否尝试将您的字典存储在一个变量中,例如let dict: [String: Any] = //...initialisation。然后返回dict as NSDictionary。另外,你真的需要 NSDictionary 吗?你为什么不使用普通的 Swift 字典? 我已经尝试过的第一个变量不是解决方案。我也觉得有问题。但我认为 NSDictionary 可以与 Dictionary 互换?所以你建议我删除 NSDictionary 并像这样返回 Dictionary 【参考方案1】:

所以问题是我们有很多这样创建的字典:

let dict = ["key": value, "key2": value2]

如果你把它改写为

var dict: [String: Any] = [String: Any]()
dict["key"] = value
dict["key2"] = value2

然后编译器神奇地只需要每个模型 15 到 20 毫秒,而不是每个模型 2000 毫秒。

您可以使用构建时间分析器应用自行尝试 :-)

【讨论】:

其实第一个字典其实是一个数组 :) 定义let dict: [String: Any] = ... 还不够。类型推断可能很慢,声明类型就足够了。 对不起,你是对的第一个是一个数组。我编辑了代码。是的,当然你可以去掉 [String: Any]() 部分。只是为了说清楚。 如果您尝试let dict: [String: Any] = ["key": value, "key2": value2] 会发生什么,即同样的事情但定义了类型? 同样的情况。你真的需要用另一种方式重写它。这解决了我没完没了的编译,但该项目有近 400 个模型......【参考方案2】:

在将项目迁移到 swift 3 后,我遇到了同样的问题,但经过大量研发后,我找到了解决方案。由于创建的字典和数组没有数据类型,因此需要一些时间。

【讨论】:

以上是关于Xcode 继续在 Swift 3 上构建的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 3 Xcode 8.2.1 在 iOS 上运行预构建的可执行文件

如何用Xcode8和Swift 3 构建条形码/二维码识别应用

更新 Xcode 后,我的 Swift 3 项目无法正常运行,但构建成功

Xcode 中使用较低 4.0.3 版本而不是 5.0.1 的 Swift 构建设置未强制执行

Xcode中的swift语言版本构建设置是啥意思?

新的 Swift 2.2 / Xcode 7.3.1 的 AppDelegate 问题