Заявление о быстрой отсрочке

Swift 2.0 включает ряд новых языковых операторов. Я недавно писал о Заявлении быстрой стражи. Defer - еще одно нововведение в Swift 2.0. Честно говоря, я не использую defer как guard, но он может быть чрезвычайно полезен.

Что делает defer, поначалу не очевидно. Defer будет ждать выполнения блока кода, пока не завершится текущая область видимости (цикл, метод и т. Д.). И он выполнит этот код вне зависимости от того, правильно ли выходит из области видимости, из-под стражи или при возникновении ошибки.

Вот самые простые примеры. Блок defer существует перед основной частью кода, но вызывается только после него.

Это может быть полезно, если, например, есть ресурсы, которые необходимо очистить перед выходом из текущей области.

Вам не нужно ограничиваться одним оператором отсрочки. Вы можете использовать несколько операторов defer. Если включено более одного, они будут вызываться в обратном порядке. Представьте, что они включаются в стек и извлекают их по одному.

Вот простой пример нескольких блоков отсрочки. Вы можете видеть, что порядок, в котором они определены, и порядок, в котором они вызываются, обратный.

Как я уже говорил выше, оператор defer не ограничивается только выходом из методов. Вы можете включать их в петли. Взгляните на этот пример. Каждый раз, когда цикл выполняется, в конце каждого цикла вызывается блок defer.

Если вы пришли из мира Objective-C или Java, вы можете аппроксимировать оператор defer с помощью блока finally из оператора throw. Синтаксис немного отличается, и в Objective-C и Java вам не разрешено иметь несколько блоков finally. Вот пример Swift использования блока defer как блока finally.

Есть предостережение при использовании оператора defer. В блоке кода отсрочки вы не можете передать управление за пределы текущей области. Вы не можете вызвать «возврат» из функции или «продолжить» из цикла.

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

Репозиторий GitHub: rwgrier / swift-defer