Swift:解包导致快速编译

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell!{

这行代码使得swift编译非常慢:

 cell!.detailTextLabel.text = child.year! + " " + child.make! + " " + child.model! 

如果我有这一行代码,需要1分44秒的时间来构build项目。 99%的时间停留在“编译Swift源文件”。 如果我改变这一行

 cell!.detailTextLabel.text = " "//child.year! + " " + child.make! + " " + child.model! 

build造这个项目只需要5到6秒。 我想知道为什么这行代码会导致这么多的时间编译。

在我的孩子模型中,他们被声明为:

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

和init:

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

我构build一个孩子的部分:

 Child(name:cName,...,year:cYear,make:cMake, model:cModel,...) 

是的,我在这个缓慢的编译问题上提交了一个bug报告(17585851),你也应该这样做; 苹果发送的用例越清晰越好。 我的慢代码是这种forms的几种情况:

 let title = obj.valueForProperty(MPMediaItemPropertyTitle) as? String self.titles += title ? title! : "" 

(你可以看到,它正在做零testing/解包)。 这样做很麻烦,但用不同的方式来解决这个问题,你也应该这样做。 但先报错吧报告!

当您的types被声明为可选项时,您需要进行解包。 在swift中,可选types是一个可能有或没有值的types。 例如,我可以声明一个string为:

var collegeName:String?

“?” 在types声明的结尾处显示collegeName可能有也可能没有值,为了得到该值,你将不得不打开它,以便通过使用! 运营商。

据我所知,在你的情况下,name字段在一年中被声明为一个string,make和model被声明为可选string,这就是为什么你需要打开这些字段来获取值。

你也可以使用“!”声明一个types 运营商喜欢:

var collegeName:String!

这意味着这是一个可选的string,但它会自动解包,所以你不需要使用“!” 之后解开这个可选。