138 votes

Existe-t-il des collections fortement typées en Objective-C ?

Je suis novice en matière de programmation Mac/iPhone et d'Objective-C. En C# et Java, nous avons des "generics", des classes de collection dont les membres ne peuvent être que du type déclaré. Par exemple, en C#

Dictionary<int, MyCustomObject>

ne peut contenir que des clés qui sont des entiers et des valeurs qui sont de type MyCustomObject. Existe-t-il un mécanisme similaire en Objective-C ?

91voto

Marc W Points 13166

Non, il n'y a pas de génériques en Objective-C, à moins que vous ne vouliez utiliser les templates C++ dans vos propres classes de collection personnalisées (ce que je déconseille fortement).

Objective-C dispose d'une fonctionnalité de typage dynamique, ce qui signifie que le runtime ne se soucie pas du type d'un objet puisque tous les objets peuvent recevoir des messages. Lorsque vous ajoutez un objet à une collection intégrée, il est simplement traité comme s'il était de type id . Mais ne vous inquiétez pas, envoyez simplement des messages à ces objets comme d'habitude ; cela fonctionnera parfaitement. (sauf bien sûr si un ou plusieurs des objets de la collection ne répondent pas au message que vous envoyez) .

Les génériques sont nécessaires dans des langages comme Java et C# parce que ce sont des langages forts, typés statiquement. C'est un jeu totalement différent du typage dynamique d'Objective-C.

16voto

mouviciel Points 36624

Les réponses à cette question peuvent vous intéresser : Existe-t-il un moyen d'imposer le typage sur NSArray, NSMutableArray, etc. ? .

Des arguments sont donnés pour expliquer pourquoi ce n'est pas une pratique courante en Objective-C/Cocoa.

11voto

Mark Rhodes Points 89

Non, mais pour le rendre plus clair, vous pouvez le commenter avec le type d'objet que vous voulez stocker, j'ai vu cela fait quelques fois quand vous devez écrire quelque chose en Java 1.4 de nos jours) par ex :

NSMutableArray* /*<TypeA>*/ arrayName = ....

o

NSDictionary* /*<TypeA, TypeB>*/ dictionaryName = ...

6voto

Matthew Vines Points 14425

Il n'y a pas de générique en Objective-C.

Du côté des docteurs

Les tableaux sont des collections ordonnées d'objets. Cocoa fournit plusieurs classes de tableaux, NSArray, NSMutableArray (une sous-classe de NSArray) et NSPointerArray.

4voto

w.m Points 2825

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X