NSArrays genéricos se pueden realizar por subclases NSArray
, y la redefinición de todos los métodos proporcionados por otros más restrictivas. Por ejemplo,
- (id)objectAtIndex:(NSUInteger)index
tendrían que ser redefinido en
@interface NSStringArray : NSArray
como
- (NSString *)objectAtIndex:(NSUInteger)index
para una NSArray a contener sólo NSStrings.
La subclase creada se puede utilizar como un reemplazo directo y ofrece muchas funciones útiles: advertencias de compilación, acceso a la propiedad, mejor creación de código y -completado 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 lenguajes 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 instrucciones: 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 por una clase personalizada llamada NumberArray
, que se crea con la siguiente afirmación:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
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.
Estoy empezando a aprender acerca de ObjC. ¿Quizás pueda usar ObjC++ para hacer el trabajo pesado? – Toybuilder
ObjC++ no es realmente un lenguaje ... simplemente una manera más de referenciar la capacidad de ObjC para manejar C++ en línea de la misma manera que manejaría C.Sin embargo, no debes hacer esto a menos que tengas que hacerlo (por ejemplo, si necesitas usar una biblioteca de terceros escrita en C++). –
Más o menos un duplicado exacto de http://stackoverflow.com/questions/649483/is-there-any-way-to-enforce-typing-on-nsarray-nsmutablearray-etc –