Ao desenvolver para iOS, há um ponto que costuma gerar confusão.
É a diferença entre categorias do Objective-C e extensions do Swift.
Ambas adicionam funcionalidades a uma classe existente, então é fácil achar que são o mesmo conceito.
Em resumo, elas são parecidas por fora, mas diferem bastante nos tipos aos quais se aplicam e na forma como funcionam.
A categoria se aplica apenas a classes e funciona em tempo de execução, enquanto a extension também se aplica a structs, enums e protocolos, sendo definida em tempo de compilação.
Hoje, vamos comparar as duas sob uma perspectiva prática.
O que é uma categoria do Objective-C?
Uma categoria é uma sintaxe que permite adicionar métodos sem herdar de uma classe existente.
Por exemplo, você pode adicionar seus próprios métodos até mesmo a classes de frameworks como NSString.
Você não precisa do código-fonte.
// NSString Adicionar um método de validação de e-mail
@interface NSString (Validation)
- (BOOL)isValidEmail;
@end
O ponto principal é que o método é anexado à classe em tempo de execução.
Isso torna a solução flexível, mas, se duas categorias definirem o mesmo método, também existe o risco de não haver garantia sobre qual delas vencerá.
Quando os nomes das categorias entram em conflito, é fácil surgir um bug cuja causa seja difícil de encontrar.
O que muda na extension do Swift?
É útil pensar na extension do Swift como uma versão ampliada das categorias.
Ela permite adicionar não apenas métodos, mas também propriedades computadas, inicializadores, tipos aninhados e conformidades a protocolos.
Mais importante: ela não se limita a classes.
Também pode ser usada em structs, enums e protocolos.
// String Adicionar uma propriedade computada
extension String {
var isValidEmail: Bool {
contains("@") && contains(".")
}
}
Em especial, uma protocol extension pode fornecer implementações padrão, um recurso poderoso que não existe nas categorias do Objective-C.
Isso reduz bastante o código duplicado.
Categoria vs extension: principais diferenças de relance
Para quem fica em dúvida, organizei tudo em uma tabela. (Com base na sintaxe de 2026)
| Classificação | Categoria do Objective-C | Swift extension |
|---|---|---|
| Tipos aplicáveis | Somente classes | Classes, structs, enums e protocolos |
| Propriedade computada | Não diretamente | Sim |
| Propriedade armazenada | Não | Não |
| Implementação padrão de protocolo | Não | Sim |
| Conflito de nomes de métodos | Há risco em tempo de execução | Evitado em tempo de compilação |
| Momento de funcionamento | Tempo de execução | Tempo de compilação |
Há também um ponto em comum.
Nenhuma das duas permite adicionar propriedades armazenadas.
Se você realmente precisar anexar estado, terá de usar o mecanismo de associated objects do Objective-C, mas ele não é exatamente recomendado.
Quando usar cada uma na prática?
Vou compartilhar os critérios que defini trabalhando em projetos.
- Em um projeto puramente Swift, uso extension sem hesitar.
- Ao manter código antigo em Objective-C, continuo usando categorias como estão.
- Quando é preciso distribuir uma funcionalidade comum entre vários tipos, uma protocol extension costuma ser a melhor resposta.
Também é comum usar as duas em conjunto.
Isso acontece porque uma funcionalidade criada com uma categoria do Objective-C pode ser usada diretamente no Swift.
Por outro lado, lembre-se de que uma extension do Swift não fica visível no Objective-C se você não adicionar @objc.
Se você ignorar esse detalhe, é fácil ocorrer um erro de compilação durante o bridging.
Em resumo, a categoria é uma extensão de tempo de execução exclusiva para classes, enquanto a extension é uma extensão de tempo de compilação que abrange quase todos os tipos.
Com as características das duas bem claras, a estrutura do código ficará muito mais organizada.
Desejo a você um ótimo desenvolvimento hoje também!

