Extensões Objective-C
Uma extensão de classe tem alguma semelhança com uma categoria, mas só pode ser adicionada a uma classe para a qual você tenha o código-fonte em tempo de compilação (a classe é compilada ao mesmo tempo que a extensão da classe).
Os métodos declarados por uma extensão de classe são implementados no bloco de implementação da classe original, portanto, você não pode, por exemplo, declarar uma extensão de classe em uma classe de estrutura, como uma classe Cocoa ou Cocoa Touch como NSString.
As extensões são, na verdade, categorias sem o nome da categoria. Muitas vezes é referido comoanonymous categories.
A sintaxe para declarar uma extensão usa a palavra-chave @interface, assim como uma descrição de classe Objective-C padrão, mas não indica qualquer herança de uma subclasse. Em vez disso, ele apenas adiciona parênteses, como mostrado abaixo -
@interface ClassName ()
@end
Características das Extensões
Uma extensão não pode ser declarada para nenhuma classe, apenas para as classes que temos implementação original do código-fonte.
Uma extensão é adicionar métodos privados e variáveis privadas que são apenas específicos para a classe.
Qualquer método ou variável declarada dentro das extensões não é acessível nem mesmo para as classes herdadas.
Exemplo de extensões
Vamos criar uma classe SampleClass que possui uma extensão. Na extensão, vamos ter uma variável privada internalID.
Então, vamos ter um método getExternalID que retorna o externalID depois de processar o internalID.
O exemplo é mostrado abaixo e não funcionará no compilador online.
#import <Foundation/Foundation.h>
@interface SampleClass : NSObject {
NSString *name;
}
- (void)setInternalID;
- (NSString *)getExternalID;
@end
@interface SampleClass() {
NSString *internalID;
}
@end
@implementation SampleClass
- (void)setInternalID {
internalID = [NSString stringWithFormat:
@"UNIQUEINTERNALKEY%dUNIQUEINTERNALKEY",arc4random()%100];
}
- (NSString *)getExternalID {
return [internalID stringByReplacingOccurrencesOfString:
@"UNIQUEINTERNALKEY" withString:@""];
}
@end
int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass setInternalID];
NSLog(@"ExternalID: %@",[sampleClass getExternalID]);
[pool drain];
return 0;
}
Agora, quando compilarmos e executarmos o programa, obteremos o seguinte resultado.
2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51
No exemplo acima, podemos ver que o internalID não é retornado diretamente. Aqui, removemos UNIQUEINTERNALKEY e disponibilizamos apenas o valor restante para o método getExternalID.
O exemplo acima usa apenas uma operação de string, mas pode ter muitos recursos como criptografia / descriptografia e assim por diante.