Swift Language
Bloques
Buscar..
Introducción
Desde Swift Documentarion
Se dice que un cierre escapa a una función cuando el cierre se pasa como un argumento a la función, pero se llama después de que la función retorna. Cuando declara una función que toma un cierre como uno de sus parámetros, puede escribir @escaping antes del tipo de parámetro para indicar que se permite que el cierre se escape.
Cierre sin escape
En Swift 1 y 2, los parámetros de cierre se escapaban por defecto. Si sabía que su cierre no escaparía al cuerpo de la función, podría marcar el parámetro con el atributo @noescape.
En Swift 3, es al revés: los parámetros de cierre no se escapan por defecto. Si pretende que se escape de la función, debe marcarla con el atributo @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)
}
}
}
Cierre de escape
Desde Swift Documentarion
@escaping
Aplique este atributo al tipo de parámetro en una declaración de método o función para indicar que el valor del parámetro se puede almacenar para su ejecución posterior. Esto significa que se permite que el valor supere la vida útil de la llamada. Los parámetros de tipo de función con el atributo de tipo de escape requieren el uso explícito de self. Para propiedades o métodos.
class ClassThree {
var closure: (() -> ())?
func doSomething(completion: @escaping () -> ()) {
closure = finishBlock
}
}
En el ejemplo anterior, el bloque de finalización se guarda en el cierre y, literalmente, vivirá más allá de la llamada a la función. Así que complier forzará a marcar el bloque de finalización como @escaping.