0Pricing
Swift Academy · Aula

Autoclosures

Adie a avaliação de expressões com @autoclosure.

Autoclosures é uma aula grátis de Swift Academy no CoddyKit. Esta é a aula 4 de 4. 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 4 aulas no total.

O que é um autoclosure

@autoclosure envolve automaticamente uma expressão de argumento em um fechamento, portanto ela não é avaliada até que a função realmente a use. Quem chama escreve uma expressão simples, não um fechamento.

Sem fechamento automático

Normalmente, a avaliação adiada exige um fechamento explícito no local da chamada:

func logIf(_ cond: Bool, _ message: () -> String) {
    if cond { print(message()) }
}
logIf(true) { "expensive" }  // caller writes braces

Com fechamento automático

@autoclosure permite que quem chama passe uma expressão simples:

func logIf(_ cond: Bool, _ message: @autoclosure () -> String) {
    if cond { print(message()) }
}
logIf(true, "expensive")  // no braces, evaluated only if cond

Demonstração da avaliação adiada

A expressão é executada somente quando o fechamento é chamado:

func pick(_ cond: Bool, _ value: @autoclosure () -> Int) -> Int {
    cond ? value() : -1
}
func costly() -> Int { print("computed"); return 42 }
print(pick(false, costly()))  // -1  -- "computed" never prints

Onde a biblioteca padrão usa isso

Os operadores && e ||, assert e ?? usam autoclosures para que o lado direito seja avaliado somente quando necessário.

Curto-circuito como ??

Uma função personalizada de valor padrão que ignora o fallback quando ele não é necessário:

func orElse<T>(_ value: T?, _ fallback: @autoclosure () -> T) -> T {
    value ?? fallback()
}
func makeDefault() -> Int { print("built"); return 0 }
print(orElse(5, makeDefault()))  // 5  -- "built" never prints

Mensagens de assert com avaliação adiada

Crie a mensagem somente quando a verificação falhar:

func check(_ cond: Bool, _ msg: @autoclosure () -> String) {
    if !cond { print("FAIL: \(msg())") }
}
check(true, "this is never built")
check(false, "boom")  // FAIL: boom

Fechamento automático e escape

Combine com @escaping para armazenar a expressão adiada e usá-la posteriormente:

var thunks: [() -> Int] = []
func defer2(_ expr: @autoclosure @escaping () -> Int) {
    thunks.append(expr)
}
defer2(1 + 1)
print(thunks[0]())  // 2  -- computed on demand

Leitura mais limpa no local da chamada

A vantagem é puramente sintática: quem chama escreve um valor, e a função recebe um fechamento:

func unless(_ cond: Bool, _ value: @autoclosure () -> String) -> String {
    cond ? "skipped" : value()
}
print(unless(false, "shown"))  // "shown"

Quando NÃO usar

Fechamentos automáticos ocultam que um argumento é um fechamento, o que pode surpreender os leitores. Use-os com moderação — apenas quando a avaliação adiada realmente ajudar, como ao evitar valores padrão dispendiosos.

func first<T>(_ a: T?, _ b: @autoclosure () -> T) -> T { a ?? b() }
print(first(nil, 99))  // 99

Fechamentos automáticos não recebem argumentos

Um fechamento automático sempre tem a forma () -> T — ele envolve uma única expressão e não pode receber parâmetros:

func once(_ make: @autoclosure () -> [Int]) -> Int {
    make().count
}
print(once([1, 2, 3]))  // 3

Verificação rápida

O que @autoclosure faz com seu argumento?

Recapitulação

Você aprendeu sobre fechamentos automáticos:

  • @autoclosure envolve uma expressão de argumento em um fechamento () -> T
  • A expressão é executada somente quando a função a chama — avaliação adiada
  • Dá suporte a &&, ||, ?? e assert
  • Combine com @escaping para armazenar; use com moderação para manter a clareza

Curso concluído! Próximo: Equatable, Hashable, Comparable.

Perguntas Frequentes

A aula “Autoclosures” é grátis?

Sim — o texto completo de “Autoclosures” é 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 4 aulas no total.

O que vou aprender em “Autoclosures”?

Adie a avaliação de expressões com @autoclosure. 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 4 de 4.

Quanto tempo leva a aula “Autoclosures”?

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. Captura de Valores por Referência
  2. Closures Escapáveis
  3. Listas de Captura e Weak Self
  4. Autoclosures
← Voltar para Swift Academy