Swift em 2025: o que há de novo na prática?
2025 foi um ano marcante para o ecossistema Apple. O Swift 6 foi lançado — uma versão que promete não apenas estabilidade, mas também mudanças fundamentais na forma como escrevemos código. Se você é desenvolvedor iOS ou macOS, precisa entender as novidades para não ficar para trás na indústria. Neste artigo, vamos analisar as principais mudanças do Swift 6 com exemplos práticos que podem ser aplicados imediatamente em projetos.
1. Enumerações não exaustivas (Non‑exhaustive enums)
Uma das mudanças mais esperadas — a possibilidade de declarar enumerações que podem ser expandidas no futuro sem quebrar a compatibilidade reversa. Antes, se uma biblioteca adicionasse um novo caso no enum, seu código quebrava. Agora isso é coisa do passado.
A declaração de tal enumeração é assim:
public enum NetworkError: Sendable { case timeout case serverError(Int) case unknown @_nonExhaustive case custom(String)}Ao processar esse enum, o compilador não exige mais que o switch seja exaustivo. Você é obrigado a adicionar um default:
func handleError(_ error: NetworkError) { switch error { case .timeout: print("Tempo esgotado") case .serverError(let code): print("Erro do servidor: \\(code)") default: print("Erro desconhecido") }}Dica prática: Se você desenvolve uma biblioteca pública ou SDK, marque seus enum com o atributo @_nonExhaustive — isso manterá a compatibilidade com versões futuras do seu código.
2. Macros: novo nível de metaprogramação
As macros, introduzidas no Swift 5.9, tornaram-se verdadeiramente poderosas em 2025. No Swift 6, surgiram macros de atributo e macros de membro, que permitem gerar código em tempo de compilação sem boilerplate desnecessário.
Vejamos um exemplo: em vez de escrever manualmente init e Codable para um modelo, você pode usar a macro embutida @MemberwiseInit (novidade do Swift 6):
@MemberwiseInitstruct UserProfile: Codable { let id: Int var name: String var email: String var age: Int}
// O compilador gera automaticamente:// init(id: Int, name: String, email: String, age: Int)// e a implementação de CodableOutro exemplo é a macro #Predicate para SwiftData:
let youngUsers = try modelContext.fetch( FetchDescriptor<UserProfile>( predicate: #Predicate { $0.age < 25 } ))As macros reduzem significativamente a quantidade de código boilerplate e diminuem a probabilidade de erros. Em 2025, seu uso tornou-se padrão para novos projetos.
3. Propriedades observáveis (Observable) e SwiftUI
No Swift 6, surgiu um novo tipo Observable, que substituiu o ObservableObject do Combine. Agora não é mais necessário escrever @Published e @ObservedObject — tudo funciona através da macro @Observable.
Exemplo de modelo:
import Observation
@Observableclass CounterViewModel { var count = 0 var isPremium = false
func increment() { count += 1 if count >= 10 { isPremium = true } }}O uso no SwiftUI ficou mais simples:
struct CounterView: View { @State private var viewModel = CounterViewModel()
var body: some View { VStack { Text("Contagem: \\(viewModel.count)") Button("Aumentar") { viewModel.increment() } if viewModel.isPremium { Text("Premium disponível!") } } .padding() }}O que mudou?
Blogs
Book Recommendations
Leia também
Trabalhando com JSON em Go: parsing e serialização para iniciantes
Deploy zero-downtime em C#: atualizando o serviço sem paradas
Filas de Tarefas em Rust: Guia Completo para Iniciantes
Livros de C# para 2025: do iniciante ao profissional
Funções de seta TypeScript com genéricos: guia completo com exemplos