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 bracesCom 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 condDemonstraçã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 printsOnde 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 printsMensagens 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: boomFechamento 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 demandLeitura 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)) // 99Fechamentos 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])) // 3Verificação rápida
O que @autoclosure faz com seu argumento?
Recapitulação
Você aprendeu sobre fechamentos automáticos:
@autoclosureenvolve 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
&&,||,??eassert - Combine com
@escapingpara 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.