Listas de captura — weak/unowned e captura de valores
Use listas de captura para controlar como as closures capturam referências e valores: [weak self], unowned e instantâneos de valores, evitando ciclos de retenção e erros sutis.
Listas de captura — weak/unowned e captura de valores é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 2 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Swift Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Swift Academy inclui 3 aulas no total.
Por que usar listas de captura?
Objetivo: controlar o que e como uma closure captura. Use [weak self] ou unowned para evitar ciclos de retenção e capture instantâneos de valores quando necessário.
Captura forte = risco de ciclo
Closures que escapam ou são armazenadas retêm os valores capturados. Capturar self fortemente nesse caso pode criar um ciclo de retenção.
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.Padrão de captura fraca
Use [weak self] para interromper o ciclo. self é opcional nesse contexto; desembrulhe-o com guard let ou encadeamento 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 (use com cuidado)
unowned pressupõe que self viverá mais do que a closure (não opcional). Use-o somente quando tiver certeza de que não poderá ser nil no momento da chamada.
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?()Ideia do instantâneo de valor
As listas de captura podem criar instantâneos de valores, como [n = count]. Sem uma lista, as constantes let internas ainda são capturadas no momento da criação.
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 = 20Vinculação de valor na lista de captura
Use uma lista de captura para criar um instantâneo de valor nomeado, como [initial = total], no momento da criação da 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
Verificação rápida: por que adicionar [weak self] a uma closure armazenada ou que escapa?
Recapitulação
Recapitulação: use [weak self] para interromper ciclos (self se torna opcional), use unowned somente quando o ciclo de vida for garantido e capture instantâneos de valores com vinculações em listas de captura.
Perguntas Frequentes
A aula “Listas de captura — weak/unowned e captura de valores” é grátis?
Sim — o texto completo de “Listas de captura — weak/unowned e captura de valores” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Swift Academy, atualize para CoddyKit PRO. O curso de Swift Academy inclui 3 aulas no total.
O que vou aprender em “Listas de captura — weak/unowned e captura de valores”?
Use listas de captura para controlar como as closures capturam referências e valores: [weak self], unowned e instantâneos de valores, evitando ciclos de retenção e erros sutis. Você pratica Swift Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Swift Academy?
Nenhuma experiência prévia é necessária. Swift Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 3.
Quanto tempo leva a aula “Listas de captura — weak/unowned e captura de valores”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Swift Academy?
Sim. Cada aula de Swift Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos de closures e captura
- Listas de captura — weak/unowned e captura de valores
- Escaping versus non-escaping e autoclosures