Когда использовать константу в Swift

#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 an NSMutableString , чтобы быть уверенным, что вы случайно не измените результат.

5. В Objective-C я обычно делаю UITableViewCell *const cell = ...; это, чтобы получить эффект, аналогичный эффекту Swift let . Это приводит к синтаксической ошибке при переопределении cell другого значения в этом методе.