2011-01-01 10 views
0

In Java können Sie eine Aufzählung mit mehreren Werten erstellen. In Ziel-C kann dies nicht einfach durchgeführt werden. Ich habe viele Seiten darüber gelesen, aber ich fand nichts befriedigendes, das mir erlauben würde, enums auf einfache Weise zu verwenden und die enum-Deklaration und ihre verschiedenen Werte in derselben Datei zu behalten.Objective-C: Aufzählung wie Java (int-Werte und viele andere für jede Aufzählung)

Ich möchte so etwas wie dies in einem enums.h schreiben:

// ======================================== 
typedef enum {eRED, eGREEN, eBLUE} ColorEnum; 
int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF }; 
NSArray *colorNames = [NSArray arrayWithObjects:@"Red color", @"light green", @"Deep blue", nil]; 
// ======================================== 

und in der Lage thoses globale Variablen zu verwenden, um meine Sachen überall verwalten mag:

int color = colorValues[eRED]; 

Aber ich don Ich weiß nicht, wie ich das schreiben soll. Ich habe Kompilierfehler wie "ColorValues" ist oft definiert. Oder wenn ich nur "statische" verwenden, habe ich viele "ColorValues" nicht in .m Datei verwendet ...

Können Sie mir helfen?

Antwort

1

Ich habe versucht die folgende Sache, die funktioniert wie ein Charme:

in enums.h

@interface enums 
    // here, the enum and its values are in the same place. 

    typedef enum {eRED, eGREEN, eBLUE} ColorEnum; 
    #define kColourValue { 0xFF0000, 0x00FF00, 0x0000FF } 
    extern int colourValues[]; 
@end 

in enums.m

@implementation enums 
    int colorValues[] = kColourValue; 
@end 

Und Sie haben eine perfekte Java-Stil Umsetzung enums in Objective-C. Wow, zwei Wochen Suche ....

1

Sie sind in der Nähe - das Problem besteht darin, dass Sie die Definition Ihres Arrays in die Header-Datei schreiben, wo mehrere Kompilierungseinheiten es schließlich duplizieren. Setzen Sie Ihre Mittellinie:

int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF }; 

in eine Ihrer .m-Dateien und die Header ändern zu lesen:

extern int colourValues[]; 

Sie werden etwas ähnliches mit colorNames tun müssen. Ändern Sie den Header:

extern NSArray *colorNames; 

Und dann erklären das eigentliche Objekt und initialisieren es in einer .m Datei.

+0

Ich bin mir nicht sicher zu verstehen. Wenn ich die mittlere Zeile in eine .m-Datei lege, sind die Enumeration und die zugehörigen Werte nicht in derselben Datei? – Oliver

+0

@Olivier, können Sie eine '# define' verwenden, um das zu beheben, wenn Sie möchten.Ich bin mir nicht sicher, ob dein beabsichtigter Entwurf eine gute Idee ist, damit anzufangen. –

+0

Ich bin mir nicht sicher, ob das Design perfekt ist, aber manchmal ist es vielleicht der Preis, um mit einer prähistorischen Sprache zu arbeiten. Die gleichen Dinge am selben Ort zu behalten, ist meiner Meinung nach eine gute Möglichkeit, den Code klar und vor allem so fehlerfrei wie möglich zu halten. – Oliver

1

Ihr Problem hat nichts mit der Enum zu tun. Es ist definiert Variablen in einer Kopfzeile (anstatt nur zu deklarieren), das ist das Problem. Erklären Sie sie einfach in der Kopfzeile und verschieben Sie die Implementierung in eine Implementierungsdatei.

Sie können auch [NSArray arrayWithObjects…] nicht außerhalb einer Methode schreiben. Lediglich statische Initialisierer (dh Werte, die zur Kompilierzeit bestimmt werden können) sind dort erlaubt, während solche Nachrichten nur zur Laufzeit aufgelöst werden. Die Lösung besteht darin, die Zuweisung in eine Initialisierungsfunktion zu verschieben (z. B. init für einen Singleton oder initialize für eine Klasse).

+0

OK ... ich plane zu schreiben: #define kMyColorValue blabla, bla, blablabla int er .h, dann benutze also #define in the.m so dass die enum und ihre entsprechenden Werte bei gehalten werden der gleiche Platz. Ich versuche ... – Oliver

+1

@Oliver: Ich denke, du hast missverstanden. Was ich sage ist, du solltest nicht "int foo = 5" in einem Header schreiben. Sie würden 'extern int foo' in die Kopfzeile schreiben und dann in eine Implementierungsdatei' int foo = 5' schreiben. – Chuck

+0

Ja, ich verstand (denke ich), was du gesagt hast, aber es gab mir eine andere Idee. – Oliver