0Pricing
Swift Academy · Aula

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 = 20

Vinculaçã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 5

Motivo 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

  1. Fundamentos de closures e captura
  2. Listas de captura — weak/unowned e captura de valores
  3. Escaping versus non-escaping e autoclosures
← Voltar para Swift Academy