Extensiones de Objective-C
Una extensión de clase tiene cierta similitud con una categoría, pero solo se puede agregar a una clase para la que tiene el código fuente en tiempo de compilación (la clase se compila al mismo tiempo que la extensión de clase).
Los métodos declarados por una extensión de clase se implementan en el bloque de implementación de la clase original, por lo que no puede, por ejemplo, declarar una extensión de clase en una clase de marco, como una clase Cocoa o Cocoa Touch como NSString.
Las extensiones son en realidad categorías sin el nombre de la categoría. A menudo se lo conoce comoanonymous categories.
La sintaxis para declarar una extensión usa la palabra clave @interface, al igual que una descripción de clase estándar de Objective-C, pero no indica ninguna herencia de una subclase. En cambio, solo agrega paréntesis, como se muestra a continuación:
@interface ClassName ()
@end
Características de las extensiones
No se puede declarar una extensión para ninguna clase, solo para las clases que tenemos la implementación original del código fuente.
Una extensión es agregar métodos privados y variables privadas que solo son específicas de la clase.
Cualquier método o variable declarada dentro de las extensiones no es accesible ni siquiera para las clases heredadas.
Ejemplo de extensiones
Creemos una clase SampleClass que tenga una extensión. En la extensión, tengamos una variable privada internalID.
Entonces, tengamos un método getExternalID que devuelva el externalID después de procesar el internalID.
El ejemplo se muestra a continuación y esto no funcionará en el compilador en línea.
#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;
}
Ahora, cuando compilemos y ejecutemos el programa, obtendremos el siguiente resultado.
2013-09-22 21:18:31.754 Extensions[331:303] ExternalID: 51
En el ejemplo anterior, podemos ver que el ID interno no se devuelve directamente. Aquí eliminamos UNIQUEINTERNALKEY y solo hacemos que el valor restante esté disponible para el método getExternalID.
El ejemplo anterior solo usa una operación de cadena, pero puede tener muchas características como cifrado / descifrado, etc.