Les NSArrays génériques peuvent être réalisés en sous-classant les éléments suivants NSArray
et en redéfinissant toutes les méthodes fournies par des méthodes plus restrictives. Par exemple,
- (id)objectAtIndex:(NSUInteger)index
devrait être redéfini dans
@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 un remplacement immédiat et apporte de nombreuses fonctionnalités utiles : avertissements du compilateur, accès aux propriétés, meilleure création et complétion du code dans Xcode. Toutes ces fonctionnalités sont des fonctionnalités de 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 cette opération et de la réduire à deux déclarations seulement, ce qui la rapproche des langages qui supportent 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 déclarations : 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 les éléments suivants NSArray
, NSDictionary
y NSSet
ainsi que leurs homologues mutables.
Un exemple : List<int>
pourrait être réalisée par une classe personnalisée appelée NumberArray
qui est créé 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 système de dénomination pour désigner ces classes comme des modèles.