1110 Stimmen

Was ist ein typedef enum in Objective-C?

Ich glaube nicht, dass ich grundsätzlich verstehe, was ein enum ist, und wann sie zu verwenden ist.

Zum Beispiel:

typedef enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;

Was wird hier wirklich erklärt?

2 Stimmen

Wird der benutzerdefinierte Typ "enum" genannt? Das hatte ich auch gedacht, bis ich auf Code stieß, der mehrere typedef enum-Deklarationen enthielt.

8 Stimmen

Nein, der benutzerdefinierte Typ ist ShapeType. Informieren Sie sich über typedef : de.wikipedia.org/wiki/Typedef

7 Stimmen

Ein typedef in Objective-C ist genau dasselbe wie ein typedef in C. Und ein enum in Objective-C ist genau dasselbe wie ein enum in C. Dies deklariert ein enum mit drei Konstanten kCircle = 0, kRectangle = 1 und kOblateSpheroid = 2 und gibt dem enum-Typ den Namen ShapeType. Wenn Sie nicht wissen, was "typedef" und "enum" bedeuten, kaufen Sie sich ein Buch über C.

27voto

Vincent Zgueb Punkte 1471

Das Enum (Abkürzung für Enumeration) wird zur Aufzählung einer Menge von Werten (Enumeratoren) verwendet. Ein Wert ist eine abstrakte Sache, die durch ein Symbol (ein Wort) dargestellt wird. Eine einfache Aufzählung könnte zum Beispiel sein

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl };

Diese Aufzählung wird anonym genannt, weil Sie kein Symbol haben, um sie zu benennen. Aber es ist trotzdem völlig korrekt. Verwenden Sie es einfach wie folgt

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;

Okay. Das Leben ist schön und alles geht gut. Aber eines Tages müssen Sie dieses enum wiederverwenden, um eine neue Variable zu definieren, um myGrandFatherPantSize zu speichern, dann schreiben Sie:

enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize;
enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize;

Aber dann haben Sie einen Compilerfehler "redefinition of enumerator". Eigentlich ist das Problem, dass der Compiler nicht sicher ist, dass die erste Aufzählung und die zweite dasselbe beschreiben.

Wenn Sie dann denselben Satz von Aufzählungszeichen (hier xs...xxxxl) an mehreren Stellen wiederverwenden wollen, müssen Sie ihn mit einem eindeutigen Namen versehen. Wenn Sie diese Menge ein zweites Mal verwenden, müssen Sie nur das Tag verwenden. Vergessen Sie aber nicht, dass dieses Tag nicht das Wort enum ersetzt, sondern nur die Menge der Aufzählungszeichen. Achten Sie dann darauf, enum wie gewohnt zu verwenden. Zum Beispiel so:

// Here the first use of my enum
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; 
// here the second use of my enum. It works now!
enum sizes myGrandFatherPantSize;

können Sie ihn auch in einer Parameterdefinition verwenden:

// Observe that here, I still use the enum
- (void) buyANewDressToMyGrandMother:(enum sizes)theSize;

Man könnte sagen, dass das Umschreiben von enum überall unpraktisch ist und den Code ein wenig seltsam aussehen lässt. Sie haben recht. Ein echter Typ wäre besser.

Dies ist der letzte Schritt auf unserem Weg zum Gipfel. Durch einfaches Hinzufügen eines typedef verwandeln wir unser enum in einen echten Typ. Ach ja, noch etwas: typedef ist innerhalb Ihrer Klasse nicht erlaubt. Dann definieren Sie Ihren Typ einfach oben. Machen Sie es so:

// enum definition
enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl };
typedef enum sizes size_type

@interface myClass {
   ...
   size_type myGrandMotherDressSize, myGrandFatherPantSize;
   ...
}

Denken Sie daran, dass die Markierung optional ist. Da wir hier in diesem Fall die Aufzählungszeichen nicht markieren, sondern nur einen neuen Typ definieren. Dann brauchen wir es eigentlich nicht mehr.

// enum definition
typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type;

@interface myClass : NSObject {
  ...
  size_type myGrandMotherDressSize, myGrandFatherPantSize;
  ...
}
@end

Wenn Sie in Objective-C mit XCode entwickeln, lasse ich Sie einige nette Makros mit dem Präfix NS_ENUM entdecken. Das sollte Ihnen helfen, gute Enums einfach zu definieren und darüber hinaus wird der statische Analyzer einige interessante Prüfungen für Sie durchführen, bevor Sie kompilieren.

Gutes Enum!

0 Stimmen

Ich dachte immer, "warum sollte jemand eine Frage beantworten, die bereits beantwortet und akzeptiert ist". Junge, ich lag die ganze Zeit falsch! Dies ist die beste Antwort und hilft Anfängern wie mir!

10voto

Rajneesh071 Punkte 30014

typedef ist nützlich, um den Namen eines vorhandenen Variablentyps neu zu definieren. Es bietet eine kurze und aussagekräftige Möglichkeit, einen Datentyp aufzurufen. z.B.:

typedef unsigned long int TWOWORDS;

hier wird der Typ unsigned long int in den Typ TWOWORDS umdefiniert. Somit können wir jetzt Variablen vom Typ unsigned long int deklarieren, indem wir schreiben,

TWOWORDS var1, var2;

anstelle von

unsigned long int var1, var2;

5voto

Vivek Sehrawat Punkte 6500
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;

dann können Sie es wie folgt verwenden :-

 ShapeType shape;

y

 enum {
    kCircle,
    kRectangle,
    kOblateSpheroid
} 
ShapeType;

jetzt können Sie es verwenden wie:-

enum ShapeType shape;

4voto

Bilal Arslan Punkte 197

Sie können das folgende Format verwenden, wobei der Standardwert mit 0 beginnt, also

  • kKreis ist 0,
  • kRectangle ist 1,
  • kOblateSpheroid ist 2.

Sie können Ihren eigenen spezifischen Startwert zuweisen.

typedef enum : NSUInteger {
    kCircle, // for your value; kCircle = 5, ...
    kRectangle,
    kOblateSpheroid
} ShapeType;

ShapeType circleShape = kCircle;
NSLog(@"%lu", (unsigned long) circleShape); // prints: 0

3voto

Priyanka Naik Punkte 325

Enum wird verwendet, um den enum-Elementen Werte zuzuweisen, was in struct nicht möglich ist. Anstatt auf die komplette Variable zuzugreifen, können wir also jedes Mal den Wert verwenden, den wir den Variablen in enum zuweisen. Standardmäßig beginnt sie mit der Zuweisung von 0, aber wir können ihr einen beliebigen Wert zuweisen und die nächste Variable in enum erhält den Wert des vorherigen Wertes +1.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X