Les NSArrays génériques peuvent être réalisés en sous-classant NSArray
et en redéfinissant toutes les méthodes fournies avec des méthodes plus restrictives. Par exemple,
- (id)objectAtIndex:(NSUInteger)index
devrait être redéfini en
@interface NSStringArray : NSArray
comme
- (NSString *)objectAtIndex:(NSUInteger)index
pour qu'un NSArray ne contienne que des NSStrings.
La sous-classe créée peut être utilisée comme remplacement instantané et apporte de nombreuses fonctionnalités utiles: avertissements du compilateur, accès aux propriétés, meilleure création de code et achèvement dans Xcode. Toutes ces fonctionnalités sont à la compilation, il n'est pas nécessaire de redéfinir l'implémentation réelle - les méthodes de NSArray peuvent toujours être utilisées.
Il est possible d'automatiser cela et de le réduire à seulement deux instructions, ce qui le rapproche des langages prenant en charge les génériques. J'ai créé une automatisation avec WMGenericCollection , où les modèles sont fournis sous forme de macros de préprocesseur C.
Après avoir importé le fichier d'en-tête contenant la macro, vous pouvez créer un NSArray générique avec deux instructions: une pour l'interface et une pour l'implémentation. Il vous suffit de fournir le type de données que vous souhaitez stocker et les noms de vos sous-classes. WMGenericCollection fournit de tels modèles pour NSArray
, NSDictionary
etNSSet
, ainsi que leurs homologues mutables.
Un exemple: List<int>
pourrait être réalisé par une classe personnalisée appelée NumberArray
, qui est créée avec l'instruction suivante:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Une fois que vous avez créé NumberArray
, vous pouvez l'utiliser partout dans votre projet. Il n'a pas la syntaxe de <int>
, mais vous pouvez choisir votre propre schéma de dénomination pour les étiqueter comme des classes en tant que modèles.