Swift:解包导致编译缓慢

6
在Swift中,func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{这行代码会使编译速度变得极慢。
cell!.detailTextLabel.text = child.year! + " " + child.make! + " " + child.model!

如果我加上这一行代码,构建项目需要1分钟44秒。99%的时间都会卡在“编译Swift源文件”这个步骤。 如果我将这一行改为:
cell!.detailTextLabel.text = " "//child.year! + " " + child.make! + " " + child.model!

这是英语翻译成中文的结果:

我只需要5或6秒钟就可以构建项目。 我想知道为什么这行代码会导致编译时间如此长。

在我的Child模型中,它们被声明为:

var name:String?
var year:String?
var make:String?
var model:String?

and the init:

init(name:String!, ... ,year:String!, make:String!, model:String!, ...){
        self.name = name
       ...
        self.year = year
        self.make = make
        self.model = model
}

我构建一个孩子的那一部分:
Child(name:cName,...,year:cYear,make:cMake, model:cModel,...)

你不应该在一个问题中问两个问题。慢编译的问题是一个问题。何时需要解包是另一个问题!如果你单独问第二个问题,我会尝试单独回答它。 - matt
@matt 谢谢,看一下我在这里的第二个问题。http://stackoverflow.com/questions/24844495/swfit-strange-behavior-about-unwrapping - fuiiii
2个回答

4
是的,我已经提交了一个关于编译速度慢的问题的错误报告(17585851),你也应该这样做;发送更多明确的使用案例给Apple,会更好。我的代码缓慢的原因是有几个类似这样的情况:
let title = obj.valueForProperty(MPMediaItemPropertyTitle) as? String
self.titles += title ? title! : ""

(正如您所看到的那样,它正在进行空值测试/取消包装)。对我来说,通过以不同的方式做相同的事情来解决问题并不困难,但比较繁琐。你也应该这样做。但首先要提交错误报告!


1
你是怎么以不同的方式让编译更快的?我怎样向苹果提交一个 bug 报告呢?谢谢! - fuiiii
我在这里记录了我遇到的问题:http://stackoverflow.com/questions/24943051/xcode-and-swift-why-is-swift-compiling-slowly-halt-and-catch-fire-ram-cpu-1,并且还报告了一个错误,参考了你的问题。 - Chris Conover

0

当你的类型被声明为可选项时,你需要进行解包操作。在Swift中,可选类型是一种可能有值也可能没有值的类型。例如,我可以将一个字符串声明为:

var collegeName: String?

类型声明的末尾的问号表示collegeName可能有值也可能没有值,在获取其值时,你需要通过使用感叹号运算符来对其进行解包。

就我所知,在你的情况下,name字段被声明为字符串,而year、make和model被声明为可选字符串,这就是为什么你需要对这些字段进行解包以获取其值。

你也可以使用感叹号运算符来声明一个类型,如下所示:

var collegeName: String!

这意味着这是一个可选字符串,但它会自动为你进行解包,所以你不需要在之后使用感叹号进行解包。


我同意你关于可选项的说法。孩子的名字也被声明为可选项。这就是我为什么感到困惑的原因,因为我不需要对其进行解包。我只是忘记在我的问题中包含它的代码了。var name:String? - fuiiii
第二个问题在这里:http://stackoverflow.com/questions/24844495/swfit-strange-behavior-about-unwrapping - fuiiii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接