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!
Это означает, что это необязательная строка, но она автоматически распаковывается для вас, поэтому вам не нужно использовать "!" затем развернуть этот вариант.