#ios #swift
#iOS #swift
Вопрос:
Я работаю над этим руководством по Swift и был удивлен, увидев использование let cell
in в tableView:cellForRowAtIndexPath
методе (см. Ниже). Объяснение, предоставленное автором учебника, является
Use let instead of var whenever you know the value won't change
Однако, не cell
изменится ли значение в приведенном ниже коде для каждой отдельной ячейки, особенно если старая ячейка не удалена из очереди, и поэтому не будет ли более подходящей переменная?
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
let object = objects[indexPath.row] as Alarm
cell.textLabel.text = object.title
return cell
}
Не могли бы вы пояснить, почему константа уместна в этом коде и в каком смысле значение value
cell
не меняется.
Ответ №1:
Однако то, что cell
изменится, вы должны посмотреть на область видимости. Эта cell
константа определяется заново для каждой итерации этого метода. То есть создается новая константа, возвращается и область действия локальной константы покидается, поэтому, когда выполняется следующий вызов этого метода и cell
определяется снова, мы имеем дело с новой константой.
Эмпирическое правило заключается в том, чтобы всегда использовать let
, если вы абсолютно не можете. Это поможет предотвратить случайное изменение переменных, которые вы не хотели изменять.
Если вы должны были определить ячейку вне метода, а затем просто использовать:
cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
Тогда определенно возникнет проблема, поскольку вы переопределяете константу.
Комментарии:
1. Спасибо, так что нет проблем с определением новой константы с тем же именем?
2. Правильно, если вы находитесь в области, где не будет столкновений с именем переменной. Поскольку вы определяете в
let
пределах локальной области действия функции, это будет новая переменная при каждом вызове метода.3. Спасибо, почему константа не используется в версии objective-c этого метода?
4. Семантика Objective-C не позволяет создавать константы таким же образом, а вместо этого больше полагается на создание неизменяемых переменных для создания аналогичного эффекта, например методов, которые возвращают
NSString
not anNSMutableString
, чтобы быть уверенным, что вы случайно не измените результат.5. В Objective-C я обычно делаю
UITableViewCell *const cell = ...;
это, чтобы получить эффект, аналогичный эффекту Swiftlet
. Это приводит к синтаксической ошибке при переопределенииcell
другого значения в этом методе.