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?

и 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,...)

Ответ 1

Да, я опубликовал отчет об ошибке (17585851) по этой медленной проблеме компиляции, и вы должны сделать то же самое; чем более ясны случаи использования Apple, тем лучше. Мой медленный код был несколькими вхождениями этой формы:

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

(который, как вы видите, делает nil-тестирование/разворачивание). Для меня было непросто, но не сложно было решить эту проблему, делая то же самое по-другому, и вы должны поступать аналогичным образом. Но сначала сообщите об этом сообщении об ошибке.

Ответ 2

Вам необходимо развернуть, когда ваши типы объявлены как дополнительные. В быстрой версии необязательный тип - это тип, который может иметь или не иметь значения. Например, я мог бы объявить строку как:

var collegeName: String?

"?" в конце объявления типа показывает, что имя колледжа может иметь или не иметь значения, и для того, чтобы получить это значение, вам придется развернуть его, чтобы получить его значение с помощью! Оператор.

Насколько я могу сказать в вашем случае, поле имени объявляется как строка в течение года, make и model объявляются как необязательные строки, поэтому вам нужно развернуть эти поля, чтобы получить из них значение.

Вы также можете объявить тип, используя "!" оператор вроде:

var collegeName: String!

Это означает, что это необязательная строка, но она автоматически распаковывается для вас, поэтому вам не нужно использовать "!" затем развернуть этот вариант.