2010-07-03 6 views
5

Ich bin neu in Objective-C, aber Erfahrung in C++ und C.Speichern Sie Enums in einem NSArray?

Ich möchte einige Enum-Konstanten in einem Array speichern. In C++ würde ich so etwas tun:

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

Aber die NSArray wird nur dann gespeichert, Objektzeiger (id's). Wie sollten sie gespeichert werden? Ich könnte sie möglicherweise auf ganze Zahlen umwandeln und sie in einem NSNumber Objekt speichern, aber das scheint unordentlich zu sein.

Ich frage mich, was erfahrene Obj-C-Programmierer tun?

Antwort

13

In Ganzzahlen umwandeln und in NSNumbers speichern. :)

Native C-Typen sind wirklich Bürger zweiter Klasse in den Cocoa Collection-Klassen, und sind oft ausführlich mit zu arbeiten, wenn Sie sich vermischen möchten. C sagt, dass enums integrale Werte haben, also ist es sicher, sie so zu verwenden.

Je nachdem, was Sie tun, können Sie den Manipulationscode natürlich vereinfachen, indem Sie diese Enumeration in ein tatsächliches Objekt ("MyColor") mit der enum als Eigenschaft einfügen. Diese Objekte könnten dann beliebig in den Collection-Klassen herumgeschleudert werden, mit einem gewissen Upfront- und Runtime-Overhead, von dem es je nach dem, was Sie gerade tun, kaum eine Rolle spielen wird.

+0

Gibt es einen schönen Obj-C-Typen für etwas, das ich in einem Schalter ... Fall verwenden kann und auch in eine setzen NSArray? – joerick

+0

@joerick: 'NSNumber' kann mit' switch' Anweisungen verwendet werden: 'switch ([myNsNumber intValue]) ...'. –

+0

Natürlich. Danke Leute! – joerick

0

würde ich eine neue Klasse machen den ENUM definieren, und dann unterstützten Farben instanziiert als

vector<colorEnumClass> supportedColours

können Sie dann Dinge wie: die Klassenmethoden geben für eine Farbe zu testen, um zu sehen, ob es sich um eine Mitglied des Vektors .. dann können Sie diese Methode in IF-Anweisungen anstelle von expliziten Tests mit relationalen Operatoren verwenden. Klarere Codierung :-)

Beachten Sie, dass der Name supportedColours darauf hinweist, dass dieser Vektor eine Konstante sein sollte, die beim Programmstart definiert und nie geändert wurde. Wenn dies der Fall ist, sollten die "Farben" im Vektor im Konstruktor gesetzt und nie verändert werden. Die Klasse sollte als Singleton implementiert werden, und Sie könnten sogar die Vektoroperatoren von pushback() usw. überschreiben, um Änderungen zu blockieren. Diese

liegt in der Natur der "new" Java enumeration technology

Ich soll auch erwähnen, dass ich auch bin neu in Objective C ein syntaktisch korrektes Codebeispiel zu liefern .. sorry.

+2

Die Frage ging nicht um Lösungen in C++ - 'vector ' ist ein C++ - Beispiel dessen, was er in ObjC machen möchte. –

0

Sie suchen vielleicht nach einer Möglichkeit, einfach alle Optionen zu durchlaufen? Wie wäre es nur mit einem Plan alten normalen Array?

Auf der anderen Seite, wenn die Leistung kein Problem ist und Sie nur suchen, um den Code ein wenig aufzuräumen; Wie wäre es mit einer Klasse ColorArray, die NSMutableArray kapselt und die entsprechenden Methoden erstellt.

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 
Verwandte Themen