Listas de captura: weak/unowned y captura de valores
Use listas de captura para controlar cómo las closures capturan referencias y valores: [weak self], unowned y snapshots de valores para evitar ciclos de retención y errores sutiles.
Listas de captura: weak/unowned y captura de valores es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 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.
¿Por qué usar listas de captura?
Objetivo: Controle qué captura un closure y cómo lo hace. Use [weak self] o unowned para evitar ciclos de retención y capture instantáneas de valores cuando sea necesario.
La captura fuerte implica riesgo de ciclos
Los closures que escapan o se almacenan retienen los valores capturados. Capturar self de forma fuerte en este caso puede crear un ciclo de retención.
class Owner {
var name = "Owner"
var onDone: (() -> Void)?
func start() {
// Strong capture of self can cause a cycle if onDone is stored:
onDone = {
print("Done by", self.name) // self captured strongly
}
}
}
var o: Owner? = Owner()
o?.start()
// If nothing nils onDone or o, both can keep each other alive.Patrón de captura débil
Use [weak self] para romper el ciclo. self es opcional dentro del closure; desenvuélvalo con guard let o use encadenamiento opcional.
class Owner2 {
var name = "Owner2"
var onDone: (() -> Void)?
func start() {
onDone = { [weak self] in
guard let self = self else { return } // safely unwrap optional self
print("Done by", self.name)
}
}
}
let o2 = Owner2()
o2.start()
o2.onDone?()unowned (úselo con cuidado)
unowned presupone que self vivirá más que el closure y no será opcional. Úselo únicamente cuando tenga la certeza de que no puede ser nil en el momento de la llamada.
class Owner3 {
var onDone: (() -> Void)?
func work() {
onDone = { [unowned self] in
// self must be alive when this runs; otherwise crash
print("Owner3 still alive")
}
}
}
let o3 = Owner3()
o3.work()
o3.onDone?()Concepto de instantánea de valores
Las listas de captura pueden crear instantáneas de valores, por ejemplo, [n = count]. Sin una lista, las constantes let internas siguen capturándose en el momento de crear el closure.
var count = 0
let makeLogger: () -> () -> Void = {
let snapshot = count // captured by value at creation
return {
print("snapshot =", snapshot, "current =", count)
}
}
count = 10
let logger = makeLogger()
count = 20
logger() // snapshot = 10, current = 20Asignación de valores en la lista de captura
Use una lista de captura para crear una instantánea de un valor con nombre, por ejemplo, [initial = total], en el momento de crear el closure.
var total = 5
let closure = { [initial = total] in
print("initial:", initial, " now:", total)
}
total = 9
closure() // initial uses captured value 5Motivo para usar weak self
Comprobación rápida: ¿Por qué añadir [weak self] a un closure almacenado o que escapa?
Resumen
Resumen: Use [weak self] para romper ciclos; self se convierte en opcional. Use unowned únicamente cuando la duración esté garantizada y capture instantáneas de valores mediante asignaciones en listas de captura.
Preguntas frecuentes
¿La lección «Listas de captura: weak/unowned y captura de valores» es gratis?
Sí — el texto completo de «Listas de captura: weak/unowned y captura de valores» 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 «Listas de captura: weak/unowned y captura de valores»?
Use listas de captura para controlar cómo las closures capturan referencias y valores: [weak self], unowned y snapshots de valores para evitar ciclos de retención y errores sutiles. 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 2 de 3.
¿Cuánto tiempo toma la lección «Listas de captura: weak/unowned y captura de valores»?
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
- Fundamentos de closures y captura
- Listas de captura: weak/unowned y captura de valores
- Escaping frente a non-escaping y autoclosures