Cierres rápidos: escape explicado

¿Alguna vez te has preguntado qué significa @escaping cuando se trabaja con cierres en Swift?

Foto de Clément Hélardot en Unsplash

En Swift, los cierres no se escapan de forma predeterminada.

Un cierre sin escape se llama inmediatamente en la función a la que se pasa. La vida de este cierre finaliza cuando finaliza la llamada a la función. Como resultado, no habrá rastro de ese cierre nunca más.

Pero este comportamiento predeterminado de un cierre puede ser un problema cuando ejecuta código asíncrono. Esto se demuestra mejor con un ejemplo muy simple. Así que vamos a entrar en materia.

Ejemplo de cierre de escape

Digamos que estás enviando mensajes a tu amigo y le preguntas "¿Cómo estás?". Como sabes, tu amigo tarda un tiempo en responder. Digamos que toma 2 segundos por ejemplo.

Ahora desea simular esta conversación amistosa en Swift.

Necesita una función que tome un cierre del controlador de respuesta como su parámetro. Este manejador de respuestas es simplemente responsable de encargarse de imprimir la respuesta de tu amigo que llega 2 segundos después:

func howAreYou(_ responseHandler: (String) -> Void) {
    print("Hey, how are you?") // you ask how are you
  
    // Simulating how it takes 2 seconds for your friend to answer:
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
        responseHandler("Hi, I'm doing really good.")
    })
  
    print("Responding takes a while...")
}
howAreYou({ friendResponse in
    print(friendResponse)
})

Esto significa que responseHandlerse destruiría antes de que llegue la respuesta de tu amigo.

Entonces, el problema es que responseHandlernunca tendría la oportunidad de manejar la respuesta de su amigo porque sería destruido antes de que "llegue" la respuesta.

Ahora puede que se pregunte si hay una manera de terminar la ejecución de esta función, pero manteniendo responseHandlervivo de alguna manera para que pueda manejar la respuesta... Bueno, eso es exactamente lo que @escapinghacen los cierres.

Ahora, para usar un cierre de escape, todo lo que necesita hacer es marcar el responseHandlercierre @escaping de la siguiente manera:

func howAreYou(_ responseHandler: @escaping (String) -> Void) {
    print("Hey, how are you?") // you ask how are you
  
    // It takes 2 seconds for your friend to answer:
DispatchQueue.main.asyncAfter(deadline: .now() + 2, execute: {
        responseHandler("Hi, I'm doing really good.")
    })
  
    print("Responding takes a while...")
}
howAreYou({ friendResponse in
    print(friendResponse)
})

¡Es tan simple como eso! ¡ Ahora su responseHandlercierre puede mostrar la respuesta de su amigo, ya que puede sobrevivir howAreYoual alcance de la función!

¿Cuándo son realmente útiles los cierres de escape?

Los cierres de escape son útiles siempre que desee que el cierre pueda vivir fuera del alcance de la función desde donde lo está llamando.

Por ejemplo, cuando se trata de solicitudes de red, por ejemplo, al obtener algunos datos de un servidor, la solicitud de red tardará un tiempo en completarse y en llegar la respuesta.

Si desea realizar algunas acciones con la respuesta de la red, necesitará un cierre de escape para que el controlador de respuesta viva fuera de la llamada de función de solicitud para manejar la respuesta, por ejemplo, 2 segundos después.

¡Eso es!

Espero que le sea útil. ¡Dale algunos aplausos para que otros también lo encuentren!

Asegúrate de seguirme en Medium para no perderte nada. Además, seamos amigos en Linkedin .

También te puede interesar

Swift: cierres simplificados

Referencias

Suggested posts

Enfoque de dos pasos para alta energía y enfoque

Enfoque de dos pasos para alta energía y enfoque

Paso 1 Arregla tu intestino. El siguiente youtube tiene buenos consejos.

Un día en Falsettoland. Parte uno.

Un día en Falsettoland. Parte uno.

- Mañana. Mojando mi pluma en sangre.

Related posts

No más contraseñas: cómo las claves de acceso reemplazarán su contraseña

No más contraseñas: cómo las claves de acceso reemplazarán su contraseña

Para evitar ambigüedades se utilizarán los siguientes términos; autenticador; El teléfono móvil que se utiliza para realizar el inicio de sesión en el sitio web; El sitio web o la aplicación que el usuario está utilizando para realizar el servicio de solicitud de inicio de sesión; El proveedor que proporciona el servicio dado, por ejemplo

La mentira del vaquero

Cómo las megacorporaciones vendieron a los estadounidenses una falsedad fornida

La mentira del vaquero

Es una mañana brillantemente dorada en las ondulantes colinas del oeste, mientras los primeros rayos del sol iluminan la hierba escarchada de las llanuras. Una manada de ganado Angus plácido, negro azabache y enorme, se recorta contra el amanecer mientras avanzan por un sendero trillado hacia un lugar que todos conocen bien; la barra de desayuno

Por qué algunos freelancers están fingiendo sus vidas

Por qué algunos freelancers están fingiendo sus vidas

Hace poco estuve en Linkedin, la red social profesional más grande del mundo, y encontré publicaciones de diseñadores independientes a los que sigo que me llamaron la atención. Todos publicaron fotos desde aviones, en la playa con sus computadoras portátiles, desde piscinas y oficinas con vistas increíbles.

3 formas comprobadas de mejorar su habilidad de escritura

Los beneficios de escribir y estrategias para ayudarte a hacerlo

3 formas comprobadas de mejorar su habilidad de escritura

En 2022, con el lanzamiento de GPT-3, la habilidad de escritura parece perder importancia. Con IA, las personas con mala escritura también pueden generar personal de calidad.