Diferença entre categoria e extensão de classe?

85

Qual é a diferença entre uma categoria e uma extensão de classe. Acredito que ambos são usados ​​para adicionar métodos personalizados em classes existentes. Alguém pode esclarecer isso? A exemplificação com código será muito apreciada.

Abhinav
fonte
3
Akusete, a página não foi encontrada.
Adil Hussain
claramente ilustrado aqui, code.tutsplus.com/tutorials/…
grassyburrito

Respostas:

103

Uma categoria é uma forma de adicionar métodos às classes existentes. Eles geralmente residem em arquivos chamados "Class + CategoryName.h", como "NSView + CustomAdditions.h" (e .m, é claro).

Uma extensão de classe é uma categoria, exceto por 2 diferenças principais:

  1. A categoria não tem nome. É declarado assim:

    @interface SomeClass ()
    
    
    - (void) anAdditionalMethod;
    
    @fim
  2. A implementação da extensão deve estar no bloco @implementation principal do arquivo.

É bastante comum ver uma extensão de classe no topo de um arquivo .m declarando mais métodos na classe, que são então implementados abaixo na seção @implementation principal da classe. Esta é uma forma de declarar métodos "pseudo-privados" (pseudo-privados porque não são realmente privados, apenas não são expostos externamente).

Dave DeLong
fonte
13
Em Class-Extensiosn, você pode sobrescrever propriedades de uma propriedade somente leitura (pública) para ser readescrita internamente. E desde o LLVM 1.5 você pode fazer ainda mais: você agora pode declarar variáveis ​​de instância em uma extensão de classe para que elas desapareçam da interface regular.
Max Seelemann de
Por que adicionar uma extensão de classe quando você poderia simplesmente implementar esses métodos e propriedades diretamente na classe? Parece um pouco redundante para mim.
user1721803
1
@ user1721803 Como Dave sugeriu, você pode querer manter algumas propriedades / métodos não expostos. É quando as extensões são usadas. Considere uma visão, você pode conectar todos os seus IBOutlets e IBActions em extensão e expor métodos que permitem inicializar / atualizar Outlets e ações podem ser delegadas de volta.
GoodSp33d
@MaxSeelemann você pode, por favor, demonstrar como fazer "uma propriedade somente leitura (pública) para ser readescrita internamente" por um pequeno script? Obrigado.
allenlinli de
Esta resposta declara a extensão no arquivo "Class + CategoryName.swift", está correto?
Ritesh.mlk
47
  1. Categoria

=> Em Objective C, quando você deseja adicionar mais alguma funcionalidade a uma classe sem herança, você simplesmente usa categoria para isso.

=> vem com seu próprio arquivo .h e .m

=> Categoryusa para adicionar novos métodos, não propriedades.

  1. Extensão de classe
-> In Objective C, when you want to make behaviour of some property private you use class extension.

-> it comes with **.h** file only.

-> mainly for properties.

Nota: quando adicionamos um novo arquivo e selecionamos uma opção de objetivo c, a categoria mostra a categoria e "categoria em" não "subclasse de" para mostrar como

@interface className (categoryName)
@end

-Você obterá dois arquivos .h e .m com nome de arquivo como ( className + categoryName.h e className + categoryName.m )

e no caso de extensão você obterá

@interface className()
@end

-Você obterá apenas um arquivo com o nome className_extensionName.h

  • Na categoria você não possui a classe, mas na extensão você é.
Anurag Bhakuni
fonte
5
@Prasanna: a extensão da classe vem apenas com o arquivo .m e não em .h
Saggy
1
a extensão de classe vem com um arquivo .h apenas e não um .m
Nishu_Priya
32
  1. Categoria é uma forma de adicionar métodos a uma classe, esteja o código-fonte disponível ou não, o que significa que você pode adicionar categoria a classes básicas como NSStringe também às suas próprias classes personalizadas.

    A extensão só pode ser adicionada às classes cujo código-fonte está disponível porque o compilador compila o código-fonte e a extensão ao mesmo tempo.

  2. Podemos adicionar variáveis ​​de instância e propriedades extras na extensão da classe, mas não na categoria.

  3. Qualquer variável e método dentro da extensão não é nem mesmo acessível para classes herdadas.

  4. A categoria e a extensão são feitas basicamente para lidar com uma grande base de código, mas a categoria é uma maneira de estender a API de classe em vários arquivos de origem, enquanto a extensão é uma maneira de adicionar métodos necessários fora do arquivo de interface principal.

  5. Use categoria quando você tiver que quebrar seu mesmo código de classe em diferentes arquivos de origem de acordo com diferentes funcionalidades, e extensão quando você precisar apenas adicionar alguns métodos necessários à classe existente fora do arquivo de interface principal. Além disso, quando você precisa modificar uma variável de instância declarada publicamente em uma classe, por exemplo, somente leitura para leitura e gravação, você pode declará-la novamente na extensão.

Venu Gopal Tewari
fonte
3
Eu li 5 perguntas semelhantes com muitas respostas, e esta é a melhor. Obrigado!
Honey,
1
Você também pode adicionar propriedades na categoria. Veja a resposta @Pebby.
atulkhatri
7

Extensão : Para tornar os métodos privados e adicionar propriedades de nossa própria classe personalizada, não da classe Apple.

Categoria : para adicionar mais métodos na classe existente, não na propriedade, pode ser usado tanto para a classe personalizada quanto para a classe Apple NSString.

Ankit garg
fonte
Simples e elegante. Continue assim
Abdul Yasin
3

Também podemos ter propriedades usando definir propriedade associada na classe de categoria.

@interface SomeClass (Private)

@property (nonatomic, assign) id newProperty;

@end

NSString * const kNewPropertyKey = @"kNewPropertyKey";

@implementation SomeClass (Private)

@dynamic newProperty;

- (void)setNewProperty:(id)aObject
{
    objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN);
}

- (id)newProperty
{
    return objc_getAssociatedObject(self, kNewPropertyKey);
}

@end

Consulte: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/

PradeepKN
fonte
2
@interface SomeClass ()


- (void) anAdditionalMethod;


@end

Acho que não é a maneira de declarar categoria. A categoria deve ter um nome

@interface SomeClass (XYZ)


- (void) anAdditionalMethod;


@end

por exemplo

@interface NSMutableArray (NSMutableArrayCreation)

+ (id)arrayWithCapacity:(NSUInteger)numItems;
- (id)initWithCapacity:(NSUInteger)numItems;

@end

Declarado para NSMutableArray pela Apple

Explorando
fonte
É assim que você declara uma extensão, não uma categoria -> @interface SomeClass ()
ChavirA
0

extensão ios semelhante a c #, classe abstrata java ou
categoria ios interface semelhante a c #, extensão de classe java

Add080bbA
fonte
4
sua resposta é como "o gato é semelhante ao tigre, respondendo a um cego". Lol
Muruganandham K
1
não é realmente. É a explicação mais direta e rápida se você conhece c # ou java.
Add080bbA
Não é muito descritivo e mal respondeu à pergunta.
KVISH
0

Categorias

As categorias são usadas quando você está criando um arquivo contendo um grande número de métodos. Portanto, elas fornecem a você a facilidade de quebrar uma única classe em módulos diferentes. Além disso, se forem feitas alterações nas categorias, o compilador não perderá tempo para compilar todo o projeto .Categorias não são capazes de adicionar novas variáveis ​​ou propriedades e pesquisar sua classe pai. Você pode substituir um método em uma categoria, mas não é uma boa ideia porque o método não pode ser substituído posteriormente. Também o fluxo pode ser afetado porque todas as categorias o mesmo nível hierárquico e, portanto, duas categorias pertencentes à mesma classe pai podem existir em tempo de execução. Também métodos protegidos podem ser criados usando categorias

Extensões

As extensões permitem que você substitua a propriedade ou adicione uma nova propriedade à classe pai existente. Sintaticamente o mesmo para as categorias, elas não têm nome e são representadas como @interface class () Nenhum arquivo .m está presente e o método declarado na extensão deve ser implementado na implementação do arquivo principal

Mais ajuda neste link

Suryanarayan Sahu
fonte
0

Aqui está o meu entendimento:

As extensões são geralmente usadas para adicionar recursos extras à nossa própria " classe personalizada ". Podemos adicionar métodos ou propriedades privadas que estendem a interface da classe, que podem ser usados ​​na implementação da classe.

As extensões devem ser gravadas no mesmo arquivo da classe. Portanto, você não pode escrever extensões para tipos predefinidos como String, Float, etc.

Por outro lado, as categorias podem ser usadas para adicionar métodos extras a classes pré-existentes. Por exemplo, podemos criar nossos próprios métodos estendendo a classe String. Observe que não podemos criar propriedades extras nas categorias. Outra vantagem principal das categorias é que podemos escrever as categorias em qualquer outro arquivo, fora do arquivo onde sua classe sai.

Além disso, ao criar categorias, você deve dar um nome para elas entre colchetes. Mas para extensão, nenhum nome é necessário. Por isso, algumas vezes também são chamadas de categorias anônimas.

iPhoneDeveloper
fonte
Você está um pouco fora do caminho.
Abdul Yasin,
@iPhoneDeveloper Podemos escrever a extensão para tipos predefinidos. Verifique este link - stackoverflow.com/a/33942484/2060508
yo2bh