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所以问题是我们有很多这样创建的字典:
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 项目无法正常运行,但构建成功