No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Reg铆strate

Comienza en:

5D
12H
59M
50S

Escaping Closure

12/16
Recursos

Aportes 8

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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.

Este tema de los closures es bastante interesante, pero un tanto complejo y de bastante estudio, encontr茅 un muy buen resumen con ejemplos simples y que me ayud贸 mucho a reforzar estos temas, se los comparto por si les puede ayudar como a mi. 馃馃徑馃槑

https://alexandrefreire.com/closures/

鈥淪e dice que un closure escapa a una funci贸n cuando el closure se pasa como un argumento a la funci贸n, pero se llama despu茅s del function returns. Cuando declaras una funci贸n que toma un closure como uno de sus par谩metros, puedes escribir @escaping antes del tipo del par谩metro para indicar que el closure puede escapar ".

Fragmento de: Apple Inc. 鈥淓l lenguaje de programaci贸n Swift (Swift 5.2)鈥. Libros de Apple. https://books.apple.com/mx/book/the-swift-programming-language-swift-5-2/id881256329

Los closures veo que permiten mayor funcionalidad pero hay que entenderlos bien. Un t茅 y a ver el v铆deo nuevamente 馃ぃ

No pod茅is escapar un clousure sin decirle expl铆citamente a ese clousure escapante donde encontrar la variable que va a hacer uso.

Me cre铆a crack porque iba entendiendo todo a la primera, pero esta clase si que est谩 馃く bueno, todo lo relacionado a closures es otro nivel.

Me resulta did谩ctico comparar este @escaping con una propiedad u objeto inicializado con el atributo by lazy de kotlin, ambas se ejecutan bajo seg煤n se vayan necesitando, aunque despu茅s de inicializada la propiedad esta se vuelve inmutable y ya no se podr谩 sobreescirbir鈥

ok todo bien pero que es esa sintaxis dentro de la funci贸n do something? Es algo as铆 como un if, y si la funci贸n dentro es ejecutada entonces x ser谩 igual a 100? Es una sintaxis muy rara.