Swift e Objective-C

Diferenças entre categoria do Objective-C e extension do Swift (conceitos e cuidados)

Ao desenvolver para iOS, há um ponto que costuma gerar confusão.

3 min de leitura
Imagem de capa de Diferenças entre categoria do Objective-C e extension do Swift (conceitos e cuidados)

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
Organizar em uma tabela deixa a diferença muito mais clara.
Organizar em uma tabela deixa a diferença muito mais clara.

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.

  1. Em um projeto puramente Swift, uso extension sem hesitar.
  2. Ao manter código antigo em Objective-C, continuo usando categorias como estão.
  3. Quando é preciso distribuir uma funcionalidade comum entre vários tipos, uma protocol extension costuma ser a melhor resposta.
Em um projeto puramente Swift, eu uso extension sem hesitar.
Em um projeto puramente Swift, eu uso extension sem hesitar.

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!

Continue lendo