Swift Language
Блоки
Поиск…
Вступление
Из Swift Documentarion
Говорят, что замыкание выходит из функции, когда замыкание передается как аргумент функции, но вызывается после возвращения функции. Когда вы объявляете функцию, которая принимает замыкание как один из ее параметров, вы можете написать @escaping перед типом параметра, чтобы указать, что закрытие разрешено.
Неэкранирующее закрытие
В Swift 1 и 2 по умолчанию закрываются параметры закрытия. Если вы знали, что ваше закрытие не ускользнет от тела функции, вы можете пометить параметр атрибутом @noescape.
В Swift 3 это наоборот: параметры закрытия по умолчанию не экранируются. Если вы намерены избежать этой функции, вы должны пометить ее атрибутом @escaping.
class ClassOne {
// @noescape is applied here as default
func methodOne(completion: () -> Void) {
//
}
}
class ClassTwo {
let obj = ClassOne()
var greeting = "Hello, World!"
func methodTwo() {
obj.methodOne() {
// self.greeting is required
print(greeting)
}
}
}
Закрытие крышки
Из Swift Documentarion
@escaping
Примените этот атрибут к типу параметра в объявлении метода или функции, чтобы указать, что значение параметра может быть сохранено для последующего выполнения. Это означает, что значение позволяет пережить время жизни вызова. Параметры типа функции с атрибутом типа escaping требуют явного использования self. для свойств или методов.
class ClassThree {
var closure: (() -> ())?
func doSomething(completion: @escaping () -> ()) {
closure = finishBlock
}
}
В приведенном выше примере блок завершения сохраняется в закрытии и будет буквально жить вне вызова функции. Таким образом, complier заставит отмечать блок завершения как @ escaping.