1107 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.

1580voto

Adam Rosenfield Punkte 373807

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.

6 Stimmen

Nette Erklärung - nur um eine Sache hinzuzufügen, struct's folgen ähnlichen Benennungsregeln in C (nicht sicher über Objective-C).

110 Stimmen

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.

0 Stimmen

Fantastisch. Kann ich einfach C++-Stil enum verwenden und auch nicht brauchen, um enum zu schreiben :)

268voto

Vladimir Grigorov Punkte 10413

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í .

13 Stimmen

Der Teil über "Enum Improvements" beginnt bei 5:58

5 Stimmen

Wie in einer anderen Antwort kommentiert, siehe Erläuterung von Apples NS_ENUM Makro von NSHipster: NSHipster.com/ns_enum-ns_options

1 Stimmen

Dies ist der Link zur offiziellen Dokumentation über NS_ENUM: developer.apple.com/library/ios/releasenotes/ObjectiveC/

51voto

hburde Punkte 1441

Ein Enum deklariert eine Menge geordneter Werte - das Typedef fügt dem lediglich einen praktischen Namen hinzu. Das 1. Element ist 0 usw.

typedef enum {
Monday=1,
...
} WORKDAYS;

WORKDAYS today = Monday;

Die obigen Angaben sind lediglich eine Aufzählung von shapeType-Tags.

34voto

Brian Mitchell Punkte 2252

Ein benutzerdefinierter Typ, der die folgenden Werte annehmen kann kCircle , kRectangle o kOblateSpheroid . Die Werte innerhalb der Aufzählung (kCircle, usw.) sind jedoch außerhalb der Aufzählung sichtbar. Es ist wichtig, dies zu beachten ( int i = kCircle; gültig ist, zum Beispiel).

31voto

Mani Punkte 17353

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
    }

0 Stimmen

Wenn eine Weiterleitung erforderlich ist, deklarieren Sie eine Aufzählung (NS_ENUM): stackoverflow.com/a/42009056/342794

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