Swift Academy · Lección

Escaping frente a non-escaping y autoclosures

Comprenda las closures non-escaping (predeterminadas) frente a @escaping (almacenadas o utilizadas después del retorno), y use @autoclosure para conseguir llamadas más legibles con evaluación diferida.

Lección 3 de 38 pasos

Escaping frente a non-escaping y autoclosures es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 3 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 3 lecciones en total.

Descripción general

Objetivo: Sepa cuándo un closure es no escapante (de forma predeterminada) frente a @escaping (almacenado o asíncrono), y cómo @autoclosure hace más limpios los sitios de llamada.

No escapante de forma predeterminada

Los parámetros de tipo closure son no escapantes de forma predeterminada: se invocan antes de que la función retorne y nunca se almacenan.

// Non-escaping by default: used immediately inside the function.
func applyTwice(_ f: (Int) -> Int, to x: Int) -> Int {
    return f(f(x))   // called synchronously; not stored
}
let doubled = applyTwice({ $0 * 2 }, to: 3)
print(doubled)  // 12

Closure escapante

Marque el parámetro con @escaping si almacena el closure o lo ejecuta después del retorno, por ejemplo, en temporizadores o trabajos asíncronos.

// Need @escaping when storing for later use:
var tasks: [() -> Void] = []

func addTask(_ work: @escaping () -> Void) {
    tasks.append(work)  // stored to run later
}

addTask { print("run later") }
tasks.forEach { $0() }

Finalización asíncrona

Las API asíncronas suelen recibir controladores de finalización @escaping, que se llaman después de que la función retorne.

func fetchData(completion: @escaping (String) -> Void) {
    // simulate async: call completion in the future
    // (In real apps, use DispatchQueue or URLSession)
    completion("done")  // still escaping by contract (may be called later)
}
fetchData { result in print(result) }

Autoclosure

@autoclosure permite que quien llama pase una expresión en lugar de escribir un closure, lo que mejora la legibilidad.

// @autoclosure converts an expression into () -> Bool automatically.
func logIf(_ condition: @autoclosure () -> Bool) {
    if condition() { print("Condition is true") }
}

let x = 3
logIf(x > 1)       // no braces needed; expression is turned into a closure

Autoclosure + escapante

@autoclosure @escaping almacena la expresión proporcionada para evaluarla más adelante; tenga en cuenta el estado capturado y el momento de evaluación.

// You can combine @autoclosure with @escaping:
// (be careful: the expression is captured and evaluated later)
var checks: [() -> Bool] = []

func enqueueCheck(_ condition: @autoclosure @escaping () -> Bool) {
    checks.append(condition)   // stored to run later
}

var threshold = 10
enqueueCheck(threshold > 5)   // captures current variable by reference semantics
threshold = 3
print(checks.map { $0() })    // re-evaluates with updated threshold

Regla de escaping

Comprobación rápida: ¿Cuándo es necesario usar @escaping?

Resumen

Resumen: Los closures son no escapantes de forma predeterminada. Use @escaping si se almacenan o se llaman más adelante. Use @autoclosure para simplificar los sitios de llamada y combínelo con @escaping con cuidado.

Gratis para empezar

Aprende Swift con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
122
Lecciones
409

Preguntas frecuentes

¿La lección «Escaping frente a non-escaping y autoclosures» es gratis?

Sí — el texto completo de «Escaping frente a non-escaping y autoclosures» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 3 lecciones en total.

¿Qué aprenderé en «Escaping frente a non-escaping y autoclosures»?

Comprenda las closures non-escaping (predeterminadas) frente a @escaping (almacenadas o utilizadas después del retorno), y use @autoclosure para conseguir llamadas más legibles con evaluación diferid… Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 3.

¿Cuánto tiempo toma la lección «Escaping frente a non-escaping y autoclosures»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de closures y captura
  2. Listas de captura: weak/unowned y captura de valores
  3. Escaping frente a non-escaping y autoclosures
← Volver a Swift Academy