Ответ 1
Swift 3: атрибуты параметра закрытия теперь применяются к типу параметра, а не самому параметру
До Swift 3 атрибуты закрытия @autoclosure
и @noescape
были атрибутами для параметра закрытия, но теперь являются атрибутами типа параметра; см. следующее принятое предложение о развитии Swift:
Ваш конкретный вопрос относится к атрибуту type @escaping
(для которого применяется то же новое правило), как описано в принятом предложении Swift для того, чтобы параметры закрытия не были экранированы по умолчанию:
Эти предложения теперь реализованы на стадии бета-тестирования Xcode 8 (см. примечания к выпуску для Xcode 8 beta 6; для входа требуется учетная запись для входа в систему)
Новое в Xcode 8 beta 6 - Swift-компилятор: Swift Language
Параметры закрывания по умолчанию не экранируются, а не явно аннотируется с помощью
@noescape
. Используйте@escaping
, чтобы указать, что параметр закрытия может исчезнуть.@autoclosure(escaping)
теперь записывается как@autoclosure @escaping
. Аннотации@noescape
и@autoclosure(escaping)
устарели. (SE-0103)...
Новое в Xcode 8 beta - Swift и Apple LLVM Compilers: Swift Language
Теперь атрибуты
@noescape
и@autoclosure
должны быть записаны перед типом параметра вместо имени параметра. [SE-0049]
Следовательно, вы используете атрибут @escaping
не по умолчанию; применяется к типу параметра закрытия, а не самому параметру
func doSomething(withParameter parameter: Int, completion: @escaping () -> ()) {
// ...
}
(Включая мой ответ на вопрос в приведенном ниже комментарии, поскольку комментарии не являются постоянными данными о SO)
@Cristi Băluţă: "Что делает побег? Никогда не видел эти ключевые слова перед автоматическим преобразованием swift3..."
См. ссылка на предложение SE-0103 по эволюции выше (а также цитированный текст из бета-версий бета-версии): ранее параметры закрытия были экранированы по умолчанию (следовательно, нет необходимость существования явной аннотации для экранирования), но теперь вместо этого не выполняется экранирование по умолчанию. Следовательно, добавление @escaping
позволяет явно аннотировать, что параметр закрытия может уйти (вопреки его поведению по умолчанию). Это также объясняет, почему @noescape
теперь устарел (нет необходимости комментировать поведение по умолчанию).
Для объяснения того, что означает, что параметр закрытия экранируется, я цитирую Reference Reference - атрибуты:
"Применить этот атрибут к типу параметров в объявлении метода или функции, чтобы указать, что значение параметров может быть сохранено для позднее исполнение. Это означает, что значение позволяет переживать время жизни вызова.