Sobes.tech
Junior — Middle

Explique a principal diferença entre closures que permitem sair do seu âmbito e aqueles que não podem.

sobes.tech IA

Resposta da IA

No iOS (Swift/Objective-C), os closures podem capturar variáveis do escopo externo. A principal diferença entre closures que podem sair do seu escopo e aqueles que não podem, está relacionada ao tempo de vida e à captura do contexto:

  • Closures que podem sair do escopo são objetos que capturam referências às variáveis do contexto externo e as mantêm, permitindo usar essas variáveis mesmo após o término do escopo original. Esses closures geralmente são armazenados em propriedades, passados como callbacks, etc.

  • Closures que não podem sair do escopo são aqueles que não são armazenados ou que não capturam o contexto, ou que são usados apenas dentro do mesmo escopo onde são definidos. Eles não podem ser chamados posteriormente, pois o contexto já foi destruído.

Exemplo:

func makeIncrementer(amount: Int) -> () -> Int {
    var total = 0
    let incrementer: () -> Int = {
        total += amount
        return total
    }
    return incrementer
}

let inc = makeIncrementer(amount: 5)
print(inc()) // 5
print(inc()) // 10

Aqui, o closure incrementer captura as variáveis total e amount e as mantém, permitindo usá-las fora da função original. Se o closure não capturasse o contexto ou não fosse armazenado, não poderia funcionar após sair da função.