2010-07-03 18 views
5

Sono nuovo di Objective-C, ma esperto in C++ e C.Memorizza le enumerazioni in un NSArray?

Voglio memorizzare alcune costanti enum in un array. In C++ vorrei fare qualcosa di simile:

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

Ma la NSArray saranno solo i puntatori negozio di oggetti (id's). Quindi, come dovrebbero essere memorizzati? Potrei eventualmente convertirli in numeri interi e archiviarli in un oggetto NSNumber, ma questo sembra disordinato.

Mi chiedo che cosa fanno i programmatori obj-c esperti?

risposta

13

Inserirli in numeri interi e memorizzarli in NSNumbers. :)

I tipi C nativi sono davvero cittadini di seconda classe nelle classi di raccolta Cocoa e sono spesso prolissi con cui lavorare se si vuole mescolare. C dice che le enumerazioni hanno valori interi, quindi è sicuro utilizzarle come intro in questo modo.

A seconda di cosa si sta facendo, ovviamente, è possibile semplificare il codice di manipolazione avvolgendo quell'enumerazione in un oggetto reale ("MyColor") che contiene enum come proprietà su di esso. Questi oggetti potrebbero quindi essere sballottati nelle classi di raccolta come desiderato, con alcune spese generali iniziali e di runtime che improbabilmente contano da un punto di vista perfetto, a seconda di cosa stai facendo.

+0

C'è un bel tipo Obj-C per qualcosa che posso utilizzare in uno switch ... case e anche messo in un NSArray? – joerick

+0

@joerick: 'NSNumber' può essere usato con le istruzioni' switch': 'switch ([myNsNumber intValue]) ...'. –

+0

Ovviamente. Grazie ragazzi! – joerick

0

vorrei fare una nuova classe definire l'enum, e quindi un'istanza di colori supportati come

vector<colorEnumClass> supportedColours

è quindi possibile fare cose come: dare i metodi della classe per la prova di un colore per vedere se si tratta di un membro del vettore .. quindi è possibile utilizzare tale metodo in istruzioni IF anziché test espliciti utilizzando operatori relazionali. Codifica più chiara :-)

avviso che il nome supportColours suggerisce che questo vettore deve essere una costante, definita all'avvio del programma e mai modificata. Se questo è il caso, i "colori" nel vettore dovrebbero essere impostati nel costruttore e mai modificati. La classe dovrebbe essere implementata come Singleton e si potrebbe anche sovrascrivere gli operatori vettoriali di pushback() ecc. Per bloccare le modifiche.

questo è nella natura del "new" Java enumeration technology

Vorrei anche ricordare che io sono troppo nuova per Objective C per fornire un esempio di codice sintatticamente corretto .. sorry.

+2

La domanda non riguardava le soluzioni in C++ - 'vector ' è un esempio in C++ di ciò che vuole fare in ObjC. –

0

Stai forse cercando un modo per scorrere semplicemente tutte le opzioni? Che ne dici di un semplice vecchio ordinamento?

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

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

D'altro canto se le prestazioni non sono un problema e si sta solo cercando di ripulire il codice un po '; come creare una classe ColorArray che incapsula NSMutableArray e crea i metodi pertinenti.

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