Использование инструкции Swift Guard

В зависимости от моего понимания оператора guard в swift я делаю следующее:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let identifier = "identifier"
    let dequeCell = tableView.dequeueReusableCellWithIdentifier(identifier)

    guard let cell = dequeCell else
    {
        // The following line gives error saying: Variable declared in 'guard'condition is not usable in its body
        cell = UITableViewCell(style: .Default, reuseIdentifier: identifier)
    }

    cell.textLabel?.text = "\(indexPath.row)"

    return cell
}

Я просто хочу понять, можем ли мы создать переменную в операторе guard и получить к ней доступ в остальной части функции? или операторы защиты предназначены для немедленного возврата или выдачи исключений?

Или я совершенно неправильно понимаю использование оператора guard?


person Vivek Molkar    schedule 30.03.2016    source источник
comment
Нет, оператор guard должен вызывать возврат или выброс метода, если он ложный.   -  person trojanfoe    schedule 30.03.2016
comment
Используйте более новый метод dequeue... (тот, который ожидает индексный путь в качестве второго аргумента): он выделит для вас ячейку, если ни одна не будет доступна в пуле повторного использования, и никогда не вернет nil. Затем принудительно введите в свой пользовательский подкласс ячейки (это никогда не должно давать сбоев, если вы правильно зарегистрировали класс/идентификатор).   -  person Nicolas Miari    schedule 30.03.2016


Ответы (1)


Документация описывает это довольно хорошо

Если условие оператора guard выполняется, выполнение кода продолжается после закрывающей скобки оператора guard. Любые переменные или константы, которым были присвоены значения с использованием необязательной привязки как части условия, доступны для остальной части блока кода, в котором появляется оператор guard.

Если это условие не выполняется, выполняется код внутри ветки else. Эта ветвь должна передать управление для выхода из блока кода, в котором появляется оператор guard. Это можно сделать с помощью оператора передачи управления, такого как return, break, continue или throw, либо вызвать функцию или метод, который не возвращает значение, например, fatalError().

В вашем конкретном случае вам вообще не нужен оператор защиты, поскольку рекомендуемый метод dequeueReusableCellWithIdentifier:forIndexPath: всегда возвращает необязательный тип.

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let identifier = "identifier"
    let dequeCell = tableView.dequeueReusableCellWithIdentifier(identifier, forIndexPath: indexPath)
    cell.textLabel?.text = "\(indexPath.row)"
    return cell
}
person vadian    schedule 30.03.2016