No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Aprovecha el precio especial.

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
20 Hrs
35 Min
1 Seg

Escaping Closure

12/16
Recursos

Aportes 8

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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.

“Se 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. “El 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 entiendo nada me voy a dormir jaja

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.

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

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.