Las matrices NSA genéricas se pueden realizar subclasificando NSArray
y redefiniendo todos los métodos proporcionados con métodos más restrictivos. Por ejemplo,
- (id)objectAtIndex:(NSUInteger)index
tendría que ser redefinido en
@interface NSStringArray : NSArray
como
- (NSString *)objectAtIndex:(NSUInteger)index
para que un NSArray contenga solo NSStrings.
La subclase creada se puede usar como un reemplazo directo y trae muchas características útiles: advertencias del compilador, acceso a la propiedad, mejor creación de código y finalización en Xcode. Todas estas son características de tiempo de compilación, no hay necesidad de redefinir la implementación real; los métodos de NSArray aún se pueden usar.
Es posible automatizar esto y reducirlo a solo dos declaraciones, lo que lo acerca a los idiomas que admiten genéricos. Creé una automatización con WMGenericCollection , donde las plantillas se proporcionan como Macros de preprocesador C.
Después de importar el archivo de encabezado que contiene la macro, puede crear un NSArray genérico con dos declaraciones: una para la interfaz y otra para la implementación. Solo necesita proporcionar el tipo de datos que desea almacenar y los nombres de sus subclases. WMGenericCollection proporciona tales plantillas para NSArray
, NSDictionary
y NSSet
, así como sus contrapartes mutables.
Un ejemplo: List<int>
podría realizarse mediante una clase personalizada llamada NumberArray
, que se crea con la siguiente instrucción:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Una vez que haya creado NumberArray
, puede usarlo en todas partes en su proyecto. Carece de la sintaxis de <int>
, pero puede elegir su propio esquema de nombres para etiquetarlos como clases como plantillas.