Sobes.tech
Junior — Middle

Por que é importante indicar explicitamente a anotação @escaping em funções que usam closures assíncronos?

sobes.tech IA

Resposta da IA

Em Swift, a anotação @escaping indica que um encerramento (closure) pode ser chamado após a função que o recebe ter terminado a sua execução. Isto é importante para operações assíncronas, onde o encerramento é guardado e chamado mais tarde, por exemplo, após a conclusão de uma requisição de rede.

Sem @escaping, o compilador assume que o encerramento é chamado de forma síncrona dentro da função, e não permite guardá-lo para chamá-lo mais tarde, para evitar possíveis problemas com a gestão de memória e o ciclo de vida.

Exemplo:

func fetchData(completion: @escaping () -> Void) {
    DispatchQueue.global().async {
        // Trabalho assíncrono
        completion() // chamando o encerramento mais tarde
    }
}

Aqui, completion é marcado como @escaping porque é chamado após sair da função fetchData, em outro thread.

Se não especificar @escaping nestes casos, o compilador gerará um erro, pois o encerramento pode ser chamado mais tarde, e sem esta anotação, Swift não garante uma gestão correta da memória e do ciclo de vida do encerramento.