web-dev-qa-db-fra.com

Comment définir et utiliser un ENUM dans Objective-C?

Comme indiqué ci-dessous, j'ai déclaré une énumération dans mon fichier d'implémentation et, dans mon interface, une variable de ce type, en tant que PlayerState thePlayerState; et utilisé la variable dans mes méthodes. Mais j'obtiens des erreurs en affirmant que c'est non déclaré. Comment déclarer et utiliser correctement une variable de type PlayerState dans mes méthodes?:

Dans le fichier .m

@implementation View1Controller

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

dans le fichier .h:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

dans une méthode dans le fichier .m:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}
181
RexOnRoids

Votre typedef doit figurer dans le fichier d'en-tête (ou dans un autre fichier dont le nom est #imported dans votre en-tête), car sinon le compilateur ne saura pas quelle taille utiliser pour PlayerState ivar. À part ça, ça me va.

109
Dave DeLong

Apple fournit une macro destinée à améliorer la compatibilité du code, y compris Swift. Utiliser la macro ressemble à ceci.

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

documenté ici

205
rebelzach

Dans le .h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;
27
Ben Flynn

Avec les projets en cours, vous souhaiterez peut-être utiliser les macros NS_ENUM() ou NS_OPTIONS().

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

Voici comment Apple le fait pour des classes comme NSString:

Dans le fichier d'en-tête:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Reportez-vous aux directives de codage à l'adresse http://developer.Apple.com/

16
Santhosbaala RS

Je recommande d'utiliser NS_OPTIONS ou NS_ENUM. Vous pouvez en savoir plus à ce sujet ici: http://nshipster.com/ns_enum-ns_options/

Voici un exemple tiré de mon propre code utilisant NS_OPTIONS. J'ai un utilitaire qui définit une sous-couche (CALayer) sur une couche d'UIView pour créer une bordure.

Le H. fichier:

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

Le fichier .m:

@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
8
Johannes