Resumen
Un escaping closure
es un closure que sobrevive a la función a la que se le pasó.
var completionHandlers: [() -> Void] = []
Como los closures se tienen que ejecutar en el momento, Swift no nos permite guardar el closure completionHandler
en un array para ejecutarlo despues. Para poder hacer esto ultimo, tenemos que agregar el modificador @escaping.
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
completionHandlers.count
En este caso no es necesario el modificador ya que el closure se va a ejecutar:
func someFunctionWithNoneEscapingClosure(closure: () -> Void) {
closure()
}
class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure {
self.x = 100 // El `self` le indica al closure con el modificador @escaping donde va a estar la variable `x`
}
someFunctionWithNoneEscapingClosure {
x = 200 // En este caso no es necesario el `self` porque el closure se va a ejecutar ahora mismo y sabe donde va a estar la variable `x`
}
}
}
let instance = SomeClass()
print(instance.x) // 10
instance.doSomething()
print(instance.x) // 200
completionHandlers.count // 1
completionHandlers.first?()
print(instance.x) // 100
El self
le indica al closure con el modificador @escaping dónde va a estar la variable x
para ser utilizada luego.
En el caso del closure someFunctionWithNoneEscapingClosure
no es necesario el self
porque el closure se va a ejecutar ahora mismo y sabe dónde va a estar la variable x
.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?