Em poucas palavras, Closures são blocos de código que podem ser atribuídos a variáveis, passados como argumentos para funções e armazenados em estruturas de dados.

A vantagem das closures é a capacidade de encapsular funcionalidades em blocos de código independentes, que podem ser passados como argumentos, capturar seu contexto e promover uma programação mais modular, flexível e legível.

OBS: Toda função é uma closure, mas nem toda closure é uma função.

Sintaxe Básica

A sintaxe da expressão de uma closure tem a seguinte forma geral:

{ (parameters) -> ReturnType in
   // statements
}

Também pode ser escrito assim:

{ (parameters) -> ReturnType = {
     // statements
}

Exemplo de Closure em constantes

Soma dois números

A closure 'soma' recebe dois argumentos, a e b, e retorna a soma de a e b.

let soma = { (a: Int, b: Int) in
  return a + b
}

Chamando a closure através da constante

let resultado = soma(5, 3) // resultado será 8

Exibir texto

Armazena uma closure que não aceita nenhum argumento e retorna uma string de saudação.

let greetClosure: () -> String = {
    return "Olá, mundo!"
}