2010-07-03 6 views
5

Je suis nouveau à Objective-C, mais expérimenté en C++ et C.Magasin enums dans un NSArray?

Je veux stocker quelques constantes enum dans un tableau. En C++ je ferais quelque chose comme ceci:

enum color {RED, BLUE, YELLOW, GREEN}; 
vector<color> supportedColors; 
supportedColors.push_back(RED); 
supportedColors.push_back(GREEN); 

Mais le NSArray ne fera que des pointeurs d'objets magasin (id's). Alors, comment devraient-ils être stockés? Je pourrais éventuellement les convertir en entiers et les stocker dans un objet NSNumber, mais cela semble désordonné.

Je me demande ce que font les programmeurs d'obj-c expérimentés?

Répondre

13

Convertissez-les en entiers et stockez-les dans NSNumbers. :)

Les types C natifs sont vraiment des citoyens de seconde classe dans les classes de collection Cocoa, et sont souvent verbeux pour travailler si vous voulez vous mélanger. C indique que les énumérations ont des valeurs intégrales, il est donc sûr de les utiliser comme des entiers de cette manière.

En fonction de ce que vous faites bien sûr, vous pouvez simplifier le code de manipulation en enveloppant cette énumération dans un objet réel ("MyColor") qui a l'enum comme une propriété sur celui-ci. Ces objets pourraient ensuite être lancés dans les classes de collection comme vous le souhaitez, avec des frais initiaux et d'exécution qui sont peu susceptibles d'avoir une incidence sur les performances, selon ce que vous faites.

+0

est-il un bon de type Obj-C pour quelque chose que je peux utiliser dans un switch ... case et également mis en un NSArray? – joerick

+0

@joerick: 'NSNumber' peut être utilisé avec les instructions' switch': 'switch ([myNsNumber intValue]) ...'. –

+0

Bien sûr. Merci les gars! – joerick

0

Je voudrais faire une nouvelle classe définissent le ENUM, et puis instancier couleurs prises en charge comme

vector<colorEnumClass> supportedColours

vous pouvez faire des choses comme: donner les méthodes de classe pour tester une couleur pour voir si elle est membre du vecteur .. alors vous pouvez utiliser cette méthode dans les instructions IF plutôt que des tests explicites utilisant des opérateurs relationnels. Codage plus clair :-)

Notez que le nom supportedColours suggère que ce vecteur devrait être une constante, définie au démarrage du programme et jamais modifiée. Si tel est le cas, les "couleurs" du vecteur doivent être définies dans le constructeur et ne doivent jamais être modifiées. La classe devrait être implémentée en Singleton et vous pourriez même remplacer les opérateurs vectoriels de pushback() etc pour bloquer les modifications.

C'est dans la nature du "new" Java enumeration technology

Je dois aussi mentionner que je suis trop nouveau pour Objective C pour fournir un exemple de code syntaxiquement correct .. désolé.

+2

La question ne portait pas sur les solutions en C++ - 'vector ' est un exemple en C++ de ce qu'il veut faire dans ObjC. –

0

Vous cherchez peut-être un moyen de simplement faire défiler toutes les options? Que diriez-vous juste d'un vieux tableau normal?

typedef enum {RED,BLUE,GREEN,YELLOW} color; 

color colors[4]={RED,YELLOW,GREEN,BLUE}; 
for (int i=0;i<4;i++) 
    colors[i]; 

D'autre part, si les performances ne sont pas un problème et que vous cherchez simplement à nettoyer un peu le code; que diriez-vous de créer une classe ColorArray qui encapsule NSMutableArray et crée les méthodes appropriées.

ColorArray.h:

#import <Foundation/Foundation.h> 

typedef enum {RED,BLUE,GREEN,YELLOW} Color; 

@interface ColorArray : NSObject { 
    NSMutableArray* _array; 
} 

- (id) initWithArray:(Color[])colors; 

- (void) addColor:(Color)color; 
- (Color) colorAtIndex:(int)i; 

@end 

ColorArray.c:

#import "ColorArray.h" 

@implementation ColorArray 

- (id) init { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
- (id) initWithArray:(Color[])colors { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
     for (int i=0;colors[i]!=0;i++) 
      [_array addObject:[NSNumber numberWithInt:colors[i]]]; 
    } 
    return self; 
} 
- (void) dealloc { 
    [_array release]; 
    [super dealloc]; 
} 

- (void) addColor:(Color)color { 
    [_array addObject:[NSNumber numberWithInt:color]]; 
} 
- (Color) colorAtIndex:(int)i { 
    return [[_array objectAtIndex:i] intValue]; 
} 

@end