【问题标题】:Xcode keeps building on Swift 3Xcode 继续在 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

标签: ios swift xcode swift3


【解决方案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 后,我遇到了同样的问题,但经过大量研发后,我找到了解决方案。由于创建的字典和数组没有数据类型,因此需要一些时间。

【讨论】:

    猜你喜欢
    • 2017-11-07
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多