Ich glaube nicht, dass ich grundlegend verstehe, was ein enum
ist und wann ich es verwenden soll.
Zum Beispiel:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
Was wird hier wirklich deklariert?
objective-c
enums
typedef
Craig
quelle
quelle
Antworten:
Drei Dinge werden hier erklärt: ein anonymer Aufzählungstyp deklariert wird,
ShapeType
ist für die anonyme Aufzählung ein typedef deklariert werden und die drei NamenkCircle
,kRectangle
undkOblateSpheroid
werden als integrale Konstanten deklariert.Lassen Sie uns das aufschlüsseln. Im einfachsten Fall kann eine Aufzählung als deklariert werden
Dies deklariert eine Aufzählung mit dem Tag
tagname
. In C und Objective-C (aber nicht C ++), alle Verweise auf diese muss mit dem vorangestellt seinenum
Stichwort. Zum Beispiel:Um zu vermeiden, dass das
enum
Schlüsselwort überall verwendet werden muss, kann ein typedef erstellt werden:Dies kann in einer Zeile vereinfacht werden:
Und schließlich, wenn wir nicht in der Lage sein müssen,
enum tagname
dasenum
Schlüsselwort zu verwenden, können wir dasenum
anonymisieren und es nur mit dem typedef-Namen deklarieren:In diesem Fall erklären wir, dass es
ShapeType
sich um einen typisierten Namen einer anonymen Aufzählung handelt.ShapeType
ist wirklich nur ein integraler Typ, und nur Variablen verwendet werden soll , zu erklären , die in der Erklärung genannten einen des Wertes halten (das heißt, einer derkCircle
,kRectangle
undkOblateSpheroid
). Sie können einerShapeType
Variablen jedoch einen anderen Wert zuweisen , indem Sie sie umwandeln. Daher müssen Sie beim Lesen von Aufzählungswerten vorsichtig sein.Schließlich
kCircle
,kRectangle
undkOblateSpheroid
als integrale Konstanten im globalen Namespace deklariert. Da keine spezifischen Werte angegeben wurden, werden sie aufeinanderfolgenden Ganzzahlen zugewiesen, die mit 0 beginnen, alsokCircle
0,kRectangle
1 undkOblateSpheroid
2.quelle
Apple empfiehlt, solche Aufzählungen seit Xcode 4.4 zu definieren :
Sie bieten auch ein praktisches Makro
NS_ENUM
:Diese Definitionen bieten eine stärkere Typprüfung und eine bessere Code-Vervollständigung. Ich konnte keine offizielle Dokumentation finden
NS_ENUM
, aber Sie können das Video "Modern Objective-C" von der WWDC 2012-Sitzung hier ansehen .UPDATE
Link zur offiziellen Dokumentation hier .
quelle
NS_ENUM
Makro durch NSHipster: NSHipster.com/ns_enum-ns_optionsEine Aufzählung deklariert eine Reihe von geordneten Werten - das typedef fügt diesem nur einen praktischen Namen hinzu. Das 1. Element ist 0 usw.
Das Obige ist nur eine Aufzählung von shapeType-Tags.
quelle
Ein Benutzer definierten Typ, die die möglichen Werte hat
kCircle
,kRectangle
oderkOblateSpheroid
. Die Werte innerhalb der Aufzählung (kCircle usw.) sind jedoch außerhalb der Aufzählung sichtbar. Es ist wichtig, dies zu berücksichtigen (int i = kCircle;
gilt zum Beispiel).quelle
Update für 64-Bit-Änderung: Laut Apple-Dokumenten über 64-Bit-Änderungen,
Sie müssen also eine Aufzählung mit dem folgenden Syntax erstellen, wenn Sie 64-Bit unterstützen.
oder
Andernfalls wird eine Warnung als angezeigt
Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType
Update für die schnelle Programmierung:
In Kürze gibt es eine Syntaxänderung.
quelle
Die Aufzählung (Abkürzung für Aufzählung) wird verwendet, um eine Reihe von Werten (Aufzählungen) aufzulisten. Ein Wert ist eine abstrakte Sache, die durch ein Symbol (ein Wort) dargestellt wird. Zum Beispiel könnte eine Grundaufzählung sein
Diese Aufzählung wird anonym genannt, da Sie kein Symbol haben, um sie zu benennen. Aber es ist immer noch vollkommen richtig. Verwenden Sie es einfach so
OK. Das Leben ist schön und alles geht gut. Aber eines Tages müssen Sie diese Aufzählung wiederverwenden, um eine neue Variable zum Speichern von myGrandFatherPantSize zu definieren. Dann schreiben Sie:
Aber dann haben Sie einen Compilerfehler "Neudefinition des Enumerators". Tatsächlich besteht das Problem darin, dass der Compiler nicht sicher ist, ob Sie zuerst aufzählen und als Zweites dasselbe beschreiben.
Wenn Sie dann denselben Satz von Enumeratoren (hier xs ... xxxxl) an mehreren Stellen wiederverwenden möchten, müssen Sie ihn mit einem eindeutigen Namen versehen. Wenn Sie dieses Set zum zweiten Mal verwenden, müssen Sie nur das Tag verwenden. Vergessen Sie jedoch nicht, dass dieses Tag nicht das Enum-Wort ersetzt, sondern nur die Enumeratoren. Achten Sie dann darauf, enum wie gewohnt zu verwenden. So was:
Sie können es auch in einer Parameterdefinition verwenden:
Man könnte sagen, dass das Umschreiben von Enum überall nicht bequem ist und den Code etwas seltsam aussehen lässt. Du hast recht. Ein echter Typ wäre besser.
Dies ist der letzte Schritt unseres großen Fortschritts zum Gipfel. Durch einfaches Hinzufügen eines Typedef können wir unsere Aufzählung in einen echten Typ umwandeln. Oh das Letzte, typedef ist in deiner Klasse nicht erlaubt. Definieren Sie dann Ihren Typ direkt oben. Mach es so:
Denken Sie daran, dass das Tag optional ist. Dann kennzeichnen wir in diesem Fall die Enumeratoren nicht, sondern nur, um einen neuen Typ zu definieren. Dann brauchen wir es nicht mehr wirklich.
Wenn Sie in Objective-C mit XCode entwickeln, können Sie einige nette Makros entdecken, denen NS_ENUM vorangestellt ist. Dies sollte Ihnen helfen, gute Aufzählungen einfach zu definieren, und hilft dem statischen Analysator außerdem, einige interessante Überprüfungen für Sie durchzuführen, bevor Sie sie kompilieren.
Gute Aufzählung!
quelle
typedef
ist nützlich, um den Namen eines vorhandenen Variablentyps neu zu definieren. Es bietet eine kurze und sinnvolle Möglichkeit, einen Datentyp aufzurufen. z.B:Hier wird der Typ unsigned long int neu definiert, um vom Typ TWOWORDS zu sein. Somit können wir jetzt Variablen vom Typ unsigned long int deklarieren, indem wir schreiben:
anstatt
quelle
dann können Sie es verwenden wie: -
und
Jetzt können Sie es verwenden wie: -
quelle
enum wird verwendet, um enum-Elementen einen Wert zuzuweisen, was in struct nicht möglich ist. Anstatt auf die vollständige Variable zuzugreifen, können wir dies jedes Mal anhand des Werts tun, den wir den Variablen in enum zuweisen. Standardmäßig beginnt es mit der Zuweisung 0, aber wir können ihm einen beliebigen Wert zuweisen, und der nächsten Variablen in enum wird ein Wert zugewiesen, der dem vorherigen Wert +1 entspricht.
quelle
Sie können im folgenden Format den Raw-Standardwert ab 0 verwenden
Sie können Ihren eigenen spezifischen Startwert zuweisen.
quelle
Mit einem typedef kann der Programmierer einen Objective-C-Typ als einen anderen definieren. Zum Beispiel,
typedef int Counter; Definiert den Typ Counter so, dass er dem int-Typ entspricht. Dies verbessert die Lesbarkeit des Codes drastisch.
quelle
Das Typedef ist ein Schlüsselwort in C und C ++. Es wird verwendet, um neue Namen für grundlegende Datentypen (char, int, float, double, struct & enum) zu erstellen .
Hier wird der aufgezählte Datentyp ShapeType erstellt und wir können neue Namen für den Aufzählungstyp ShapeType schreiben, wie unten angegeben
quelle
enum kann viele Arten von "Fehlern" reduzieren und den Code übersichtlicher machen
Die Definition unterliegt keinen Einschränkungen. Es ist einfach nur eine Substitution. Es ist nicht in der Lage, alle Bedingungen des Staates einzuschränken. Wenn der STATE 5 zugewiesen ist, ist das Programm falsch, da kein übereinstimmender Status vorliegt. Der Compiler wird STATE = 5 jedoch nicht warnen
Es ist also besser, so zu verwenden
quelle