Swift 3: атрибути параметра закриття тепер застосовуються до типу параметра , а не до самого параметра
До Swift 3 атрибути закриття @autoclosure
і @noescape
раніше були атрибутами параметра закриття , але тепер є атрибутами типу параметра ; див. наступну прийняту пропозицію Swift evolution:
Ваше конкретне запитання стосується атрибута типу параметра @escaping
(для якого застосовується те саме нове правило), як описано у прийнятій пропозиції еволюції Swift, щоб дозволити параметрам закриття за замовчуванням не екранувати:
Тепер ці пропозиції реалізовані на бета-стадії Xcode 8 (див. Примітки до випуску для Xcode 8 beta 6 ; для доступу потрібен вхід в обліковий запис розробника)
Нове у Xcode 8 beta 6 - Swift Compiler: Swift Language
Параметри закриття за замовчуванням не екрануються, а не явно анотовані @noescape
. Використовуйте @escaping
для позначення того, що параметр закриття може вийти. @autoclosure(escaping)
тепер пишеться як
@autoclosure @escaping
. Анотації @noescape
та
@autoclosure(escaping)
застаріли. (SE-0103)
...
Нове у бета-версії Xcode 8 - компілятори Swift та Apple LLVM: мова Swift
Тепер атрибути @noescape
and @autoclosure
слід писати перед типом параметра, а не перед іменем параметра. [SE-0049]
Отже, ви використовуєте @escaping
атрибут не за замовчуванням наступним чином; застосовується до типу параметра закриття, а не до самого параметра
func doSomething(withParameter parameter: Int, completion: @escaping () -> ()) {
}
(Включаючи мою відповідь на запитання в прихильному коментарі нижче, оскільки коментарі не є постійними даними про SO)
@Cristi Băluță: "Що робить втеча? Ніколи не бачив цих ключових слів до автоматичного перетворення swift3 ..."
Див., Наприклад, посилання на пропозицію щодо еволюції SE-0103 вище (а також наведений текст із приміток до випуску бета-версії 6): раніше параметри закриття за замовчуванням сходили (отже, немає необхідності існувати явна анотація для екранування), але тепер за замовчуванням замість цього не виходять. Звідси додано, @escaping
щоб явно анотувати, що параметр закриття може вийти (всупереч поведінці за замовчуванням). Це також пояснює, чому @noescape
зараз застаріла (не потрібно коментувати поведінку за замовчуванням).
Щоб пояснити, що це означає, що параметр закриття витікає, я цитую посилання на мову - атрибути :
"Застосуйте цей атрибут до типу параметра в декларації методу або функції, щоб вказати, що значення параметра можна зберегти для подальшого виконання. Це означає, що це значення може пережити термін дії виклику."