2010-02-06 14 views
169

He declarado una enumeración en mi archivo de implementación como se muestra a continuación, y he declarado una variable de ese tipo en mi interfaz como PlayerState thePlayerState; y usé la variable en mis métodos. Pero recibo errores que dicen que no está declarado. ¿Cómo puedo declarar y utilizar correctamente una variable de tipo PlayerState en mis métodos ?:¿Cómo puedo definir y usar un ENUM en Objective-C?

En el archivo .m

@implementation View1Controller 

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

en el archivo .h:

@interface View1Controller : UIViewController { 

    PlayerState thePlayerState; 

en algún método de archivo .m:

-(void)doSomethin{ 

thePlayerState = PLAYER_OFF; 

} 
+2

Ahora el tipo de la enumeración es thePlayerState. ¿En qué se convierten los PlayerStateTypes? –

+3

Para obtener información sobre NS_ENUM y su sintaxis moderna más reciente, consulte la publicación [NS_ENUM & NS_OPTIONS] (http://nshipster.com/ns_enum-ns_options/) de Mattt Thompson. –

Respuesta

106

Sus typedef tiene que estar en el archivo de cabecera (o algún otro archivo que es #import ed en su encabezado), porque de lo contrario el compilador no sabrá qué tamaño hacer el PlayerState ivar. Aparte de eso, me parece bien.

+16

+1. Todo lo que puede hacer en C funciona en Objective-C. –

+0

La opción de ponerlo en un archivo separado parecía correcto en mi caso. No sé si este es un buen enfoque, pero necesitaba usar la misma enumeración en dos ViewControllers diferentes (uno mismo y su delegado/origen de datos). Importar el encabezado del delegado/origen de datos resultó en un error y parece demasiado para una necesidad simple. Así que creé un nuevo archivo .h con el enum declarado y lo importé en ambos archivos viewControllers.h.Trabajado como un encanto. –

+6

Debería recomendar utilizar la macro NS_ENUM, ya que esta es la mejor práctica – khebbie

16

Esto es cómo Apple lo hace por clases como NSString:

En el archivo de cabecera:

enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
}; 

typedef NSInteger PlayerState; 

Consulte Pautas de codificación en http://developer.apple.com/

+3

Esto en realidad no ayuda al OP. Si bien es técnicamente correcto, no les dice cómo crear una enumeración reutilizable – RyanR

+21

La vinculación con developer.apple.com no es de gran ayuda. ¿Hay algún otro lugar que quieras citar en su lugar? – Brett

+0

Copie/pegue la documentación que ya ha dado, el enlace que es la página principal no está ayudando realmente a otra gente ... –

23

En el .h:

typedef enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
} PlayerState; 
+0

Puede encontrar una respuesta como esta en otras preguntas de SO, pero cuando estaba revisando enumeraciones, esta pregunta apareció primero, así que agregué la respuesta aquí también . –

191

Apple proporciona una macro para ayudar a proporcionar una mejor compatibilidad de código, incluyendo Swift. El uso de la macro se ve así.

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

Documented here

+0

Can Obj C Enums tiene variables miembro como pueden en Java? ¿Si es así, cómo? – clocksmith

+0

¿Entonces la segunda solución es mejor? –

+3

La segunda solución es mejor (usando 'NS_ENUM'), ya que es más moderna, y ahora se requiere en Objective-C si desea que su enumeración esté disponible en código Swift. – smileyborg

19

Con proyectos actuales es posible que desee utilizar los NS_ENUM() o NS_OPTIONS() macros.

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

Esta buena publicación explica por qué: http://nshipster.com/ns_enum-ns_options/ – smileyborg

+2

... y más importante ahora, debe declarar enumeraciones usando 'NS_ENUM' en Objective-C si desea que su enumeración esté disponible en Swift código. – smileyborg

5

Recomiendo usar NS_OPTIONS o NS_ENUM. Puedes leer más sobre esto aquí: http://nshipster.com/ns_enum-ns_options/

Aquí hay un ejemplo de mi propio código usando NS_OPTIONS, tengo una utilidad que establece una subcapa (CALayer) en una capa de UIView para crear un borde.

La h. archivo:

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 

El archivo .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 
Cuestiones relacionadas