Wie definiere und verwende ich ein ENUM in Objective-C?

Lesezeit: 5 Minuten

Benutzeravatar von RexOnRoids
RexOnRoids

Ich habe eine Aufzählung in meiner Implementierungsdatei wie unten gezeigt deklariert und eine Variable dieses Typs in meiner Schnittstelle als PlayerState thePlayerState deklariert; und die Variable in meinen Methoden verwendet. Aber ich bekomme Fehlermeldungen, die besagen, dass es nicht deklariert ist. Wie deklariere und verwende ich eine Variable vom Typ PlayerState korrekt in meinen Methoden?:

In der .m-Datei

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

in der .h-Datei:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

in irgendeiner Methode in .m-Datei:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

  • Jetzt ist der Typ der Aufzählung thePlayerState. Was wird aus playerStateTypes?

    – Benutzer4951

    11. Oktober 2012 um 10:07 Uhr

  • Informationen zu NS_ENUM und seiner neuesten modernen Syntax finden Sie im Beitrag NS_ENUM & NS_OPTIONS von Matt Thompson.

    – Basilikum Bourque

    22. Oktober 2013 um 0:06 Uhr


Benutzeravatar von rebelzach
rebelzach

Apple stellt ein Makro bereit, um eine bessere Codekompatibilität, einschließlich Swift, bereitzustellen. Die Verwendung des Makros sieht so aus.

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

Hier dokumentiert

  • Können Obj C Enums Mitgliedsvariablen haben, wie sie es in Java können? Wenn das so ist, wie?

    – Uhrmacher

    8. August 2014 um 15:42 Uhr

  • Also ist die zweite Lösung besser?

    – Julian Onofrei

    8. September 2014 um 12:21 Uhr

  • Die zweite Lösung ist besser (mit NS_ENUM), da es moderner ist und jetzt in Objective-C erforderlich ist, wenn Sie möchten, dass Ihre Aufzählung in Swift-Code verfügbar ist.

    – Smileyborg

    10. Januar 2015 um 4:10 Uhr

  • Aktualisiert, um zu zeigen, dass die zweite Lösung tatsächlich besser ist.

    – rebelzach

    29. Januar 2015 um 22:38 Uhr

  • In der Standardform von Apple wird der Typname für jeden Aufzählungswert wiederholt.

    – ThomasW

    9. Dezember 2015 um 6:42 Uhr

Dein typedef muss in der Header-Datei (oder einer anderen Datei, die #importin Ihren Header eingefügt), weil der Compiler sonst nicht weiß, welche Größe er machen soll PlayerState Ivar. Ansonsten sieht es für mich ok aus.

  • Die Option, es in einer separaten Datei abzulegen, erschien mir in meinem Fall richtig. Ich weiß nicht, ob dies ein guter Ansatz ist, aber ich musste dieselbe Aufzählung in zwei verschiedenen ViewControllern verwenden (selbst und sein Delegat/Datenquelle). Das Importieren des Headers des Delegaten/der Datenquelle führte zu einem Fehler und scheint für einen einfachen Bedarf zu viel zu sein. Also habe ich eine neue .h-Datei mit der deklarierten Aufzählung erstellt und sie in beide viewControllers.h-Dateien importiert. Lief wie am Schnürchen.

    – Leandro Alves

    8. Mai 2012 um 17:12 Uhr

  • Sollte empfehlen, das NS_ENUM-Makro zu verwenden – da dies die beste Vorgehensweise ist

    – khebbie

    25. Juli 2013 um 11:25 Uhr

  • Sie müssen Aufzählungen mit deklarieren NS_ENUM in Objective-C, wenn Sie möchten, dass Ihre Enum im Swift-Code verfügbar ist.

    – Smileyborg

    10. Januar 2015 um 4:08 Uhr

  • @DaveDeLong, ist das 2015 noch gültig? ich habe typedef erklärt in der .m Datei und es kompiliert und läuft gut.

    – Julian Onofrei

    14. April 2015 um 13:34 Uhr


  • @IulianOnofrei es würde in die .h-Datei gehen, wenn Sie die Aufzählung in anderen Dateien verwenden müssen. Wenn Sie es nur in einer Datei benötigen, war es immer völlig in Ordnung, es in die .m-Datei zu stecken.

    – David DeLong

    14. April 2015 um 13:36 Uhr

Im .h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

  • Eine solche Antwort finden Sie in anderen SO-Fragen, aber als ich Aufzählungen durchgesehen habe, ist diese Frage zuerst aufgetaucht, also habe ich die Antwort auch hier hinzugefügt.

    – Ben Flynn

    3. April 2012 um 20:04 Uhr

Bei aktuellen Projekten möchten Sie vielleicht die verwenden NS_ENUM() oder NS_OPTIONS() Makros.

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };

So macht es Apple für Klassen wie NSString:

In der Header-Datei:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Siehe Codierungsrichtlinien unter http://developer.apple.com/

  • Das hilft dem OP nicht wirklich weiter. Obwohl es technisch korrekt ist, sagt es ihnen nicht, wie man eine wiederverwendbare Aufzählung erstellt

    – RyanR

    27. Juni 2011 um 16:49 Uhr

  • Die Verlinkung auf developer.apple.com ist nicht wirklich hilfreich. Gibt es einen anderen Ort, den Sie stattdessen zitieren möchten?

    – Brett

    13. August 2012 um 2:16 Uhr

  • Kopieren / Einfügen der bereits vorhandenen Dokumentation, der Link, der die Hauptseite ist, hilft anderen wirklich nicht …

    – Unter OZCAN

    28. April 2015 um 7:07 Uhr

  • Dies ist jetzt veraltet, siehe diese Seite developer.apple.com/library/ios/releasenotes/ObjectiveC/…

    – Alex Chesters

    14. Dezember 2015 um 14:05 Uhr

Benutzeravatar von Johannes
Johannes

Ich empfehle die Verwendung von NS_OPTIONS oder NS_ENUM. Hier kannst du mehr darüber lesen: http://nshipster.com/ns_enum-ns_options/

Hier ist ein Beispiel aus meinem eigenen Code mit NS_OPTIONS. Ich habe ein Dienstprogramm, das eine Unterebene (CALayer) auf der Ebene einer UIView festlegt, um einen Rahmen zu erstellen.

Das h. Datei:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

Die .m-Datei:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

@end

  • Das hilft dem OP nicht wirklich weiter. Obwohl es technisch korrekt ist, sagt es ihnen nicht, wie man eine wiederverwendbare Aufzählung erstellt

    – RyanR

    27. Juni 2011 um 16:49 Uhr

  • Die Verlinkung auf developer.apple.com ist nicht wirklich hilfreich. Gibt es einen anderen Ort, den Sie stattdessen zitieren möchten?

    – Brett

    13. August 2012 um 2:16 Uhr

  • Kopieren / Einfügen der bereits vorhandenen Dokumentation, der Link, der die Hauptseite ist, hilft anderen wirklich nicht …

    – Unter OZCAN

    28. April 2015 um 7:07 Uhr

  • Dies ist jetzt veraltet, siehe diese Seite developer.apple.com/library/ios/releasenotes/ObjectiveC/…

    – Alex Chesters

    14. Dezember 2015 um 14:05 Uhr

1425410cookie-checkWie definiere und verwende ich ein ENUM in Objective-C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy