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?
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?
Hier werden drei Dinge deklariert: Ein anonymer Aufzählungstyp wird deklariert, ShapeType
wird als Typendefinition für diese anonyme Aufzählung deklariert, und die drei Namen kCircle
, kRectangle
y kOblateSpheroid
werden als integrale Konstanten deklariert.
Lassen Sie uns das aufschlüsseln. Im einfachsten Fall kann eine Aufzählung deklariert werden als
enum tagname { ... };
Dies deklariert eine Aufzählung mit dem Tag tagname
. In C und Objective-C (aber pas C++), alle Verweise auf diese doit vorangestellt werden, die enum
Stichwort. Zum Beispiel:
enum tagname x; // declare x of type 'enum tagname'
tagname x; // ERROR in C/Objective-C, OK in C++
Um zu vermeiden, dass Sie die enum
Schlüsselwort, kann ein Typedef erstellt werden:
enum tagname { ... };
typedef enum tagname tagname; // declare 'tagname' as a typedef for 'enum tagname'
Dies kann in einer Zeile vereinfacht werden:
typedef enum tagname { ... } tagname; // declare both 'enum tagname' and 'tagname'
Und schließlich, wenn wir nicht in der Lage sein müssen, die enum tagname
mit dem enum
Schlüsselwort, können wir die enum
anonymous und deklarieren es nur mit dem typedef-Namen:
typedef enum { ... } tagname;
Nun, in diesem Fall erklären wir ShapeType
ein typisierter Name einer anonymen Aufzählung zu sein. ShapeType
ist eigentlich nur ein Integraltyp und sollte nur dazu verwendet werden, Variablen zu deklarieren, die einen der in der Deklaration aufgeführten Werte enthalten (d. h. einen der kCircle
, kRectangle
y kOblateSpheroid
). Sie können eine ShapeType
Variable einen anderen Wert durch Casting, so müssen Sie vorsichtig sein, wenn Sie Enum-Werte lesen.
Endlich, kCircle
, kRectangle
y kOblateSpheroid
werden als integrale Konstanten im globalen Namensraum deklariert. Da keine spezifischen Werte angegeben wurden, werden sie aufeinanderfolgenden Ganzzahlen zugewiesen, die mit 0 beginnen, also kCircle
ist 0, kRectangle
ist 1, und kOblateSpheroid
ist 2.
Nette Erklärung - nur um eine Sache hinzuzufügen, struct's folgen ähnlichen Benennungsregeln in C (nicht sicher über Objective-C).
Objective-C ist eine echte Obermenge von C. Alle Regeln für die Benennung von C-Strukturen in C sind auch in Objective-C gültig.
Fantastisch. Kann ich einfach C++-Stil enum verwenden und auch nicht brauchen, um enum zu schreiben :)
Apple empfiehlt, Enums auf diese Weise zu definieren, da Xcode 4.4 :
typedef enum ShapeType : NSUInteger {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
Sie bieten auch ein praktisches Makro NS_ENUM
:
typedef NS_ENUM(NSUInteger, ShapeType) {
kCircle,
kRectangle,
kOblateSpheroid
};
Diese Definitionen bieten eine bessere Typüberprüfung und eine bessere Codevervollständigung. Ich konnte keine offizielle Dokumentation zu NS_ENUM
aber Sie können das "Modern Objective-C"-Video von der WWDC 2012-Sitzung ansehen aquí .
UPDATE
Link zur offiziellen Dokumentation aquí .
Wie in einer anderen Antwort kommentiert, siehe Erläuterung von Apples NS_ENUM
Makro von NSHipster: NSHipster.com/ns_enum-ns_options
Dies ist der Link zur offiziellen Dokumentation über NS_ENUM: developer.apple.com/library/ios/releasenotes/ObjectiveC/
Update für 64-Bit Änderung: Nach Angaben von Apfeldokumente über 64-Bit-Änderungen,
Aufzählungen sind auch typisiert: Im LLVM-Compiler können Aufzählungstypen die Größe der Aufzählung definieren. Das bedeutet, dass einige Aufzählungstypen Typen auch eine Größe haben können, die größer ist, als Sie erwarten. Die Lösung, wie in allen anderen Fällen, ist es, keine Annahmen über die Größe eines Größe eines Datentyps zu machen. Weisen Sie stattdessen alle Aufzählungswerte einer Variablen mit dem richtigen Datentyp
Sie müssen also Enum mit Typ erstellen wie untenstehende Syntax, wenn Sie 64-Bit unterstützen.
typedef NS_ENUM(NSUInteger, ShapeType) {
kCircle,
kRectangle,
kOblateSpheroid
};
ou
typedef enum ShapeType : NSUInteger {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
Andernfalls wird es zu einer Warnung führen als Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType
Update für swift-programming:
In swift gibt es eine Änderung der Syntax.
enum ControlButtonID: NSUInteger {
case kCircle , kRectangle, kOblateSpheroid
}
Wenn eine Weiterleitung erforderlich ist, deklarieren Sie eine Aufzählung (NS_ENUM): stackoverflow.com/a/42009056/342794
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.
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.