Una de las cosas más interesantes de Javascript es la posibilidad de ir agregando propiedades y funcionalidades a las clases ya existentes. En Objective C se puede realizar algo similar utilizando las Categorías. Esto nos da la posibilidad de realizar la implementación de una clase mediante varias personas a la vez. Cada uno sería responsable de un fichero y se podría realizar una gestión de versiones muy sencilla.
Creación de una Categoría
Para crear la categoría en un proyecto abierto es necesario crear un nuevo fichero mediante el uso del menú File->New->File o pulsando Comando + N. Aparecerá el Asistente de creación de nuevo fichero:
Seleccionamos Objective-C category y pulsamos en Next. Aparecerá la pantalla de nombres:
Aquí es donde debemos escribir el nombre de la categoría y el nombre de la clase de la cual queremos ampliar funcionalidades en el campo Category on. Cuando terminemos pulsamos en Next. Y nos saldrá la pantalla de guardado:
Dejaremos que lo guarde en la misma carpeta del proyecto. Recordad dejar seleccionado en Targets el nombre del proyecto. Pulsamos en Create. Ahora nos debería aparecer el fichero de implementación de la nueva categoría, con un contenido similar a este:
#import “NSString+DVString.h”
@implementation NSString (DVString)
@end
Por otra parte deberíamos tener el fichero de cabecera .h:
#import <Foundation/Foundation.h>
@interface NSString (DVString)
@end
Como podemos ver el nombre de los ficheros debería ser primero el nombre de la clase que queremos ampliar un + y luego el nombre que le hemos dado a nosotros ala categoría. Por otra parte tanto en el fichero de cabecera como en el de implementación, se parecen mucho a los de una clase normal con sus @implementation y @end en el fichero de implementación. Y en el de cabecera con el @interface y @end .
En ambos casos después del primer @ se coloca el nombre de la clase que queremos ampliar funcionalidad y entre () el nombre de la categoría que estamos escribiendo.
Obviamente en el fichero de cabecera importamos las clases fundacionales y en el de implementación el fichero de cabecera de la categoría.
Incluyendo métodos y propiedades
La inclusión de métodos y propiedades sería de una manera similar a como se realiza en una clase normal. Tal como indicamos en el tema sobre
Clases y Objetos.
Por ejemplo vamos a incluir un método que permita imprimir la cadena de caracteres por consola, el fichero de cabecera quedaría así:
#import <Foundation/Foundation.h>
@interface NSString (DVString)
– (void) imprime;
@end
y el fichero de implementación sería este:
#import “NSString+DVString.h”
@implementation NSString (DVString)
– (void) imprime{
NSLog(@”%@”,self);
}
@end
Com puede verse hemos declarado e implementado un método llamado imprime que permite sacar por consola el valor de la cadena almacenada en el objeto.
Utilizando un Objeto de la categoría
Para ello en el fichero main.m deberemos importar el fichero de cabecera de la categoría:
#import “NSString+DVString.h”
La declaración del Objeto sería como se hace normalmente con un objeto NSString:
NSString *cadena=@”valor”;
Después sólo restaría utilizar el método declarado en la categoría: