2011-05-06 11 views
17

En un archivo de cabecera, tengo algo como:@class para typedef enum?

// PasscodeInputViewController.h 

typedef enum { 
    PasscodeInputModeOn,  // set passcode 
    PasscodeInputModeEnter, // enter passcode 
    PasscodeInputModeChange, // change passcode 
    PasscodeInputModeOff  // turn off passcode 
} PasscodeInputMode; 

En otro archivo de cabecera, que declarar un método que toma un argumento de tipo PasscodeInputMode:

#import "PasscodeInputViewController.h" 

- (void)presentPasscodeInputWithMode:(PasscodeInputMode)mode; 

Como se puede ver, yo uso #import "PasscodeInputViewController.h" como se indica arriba para que se reconozca PasscodeInputMode, pero ¿existe un @class equivalente para typedef enum?

+0

¿Qué quiere decir? ¿Qué estás tratando de hacer específicamente? – ughoavgfhw

+0

¿cuál es el problema con el #import? –

+0

@Inder Kumar Rathore, bueno para los nombres de clase que se supone que debes usar '@ class' en el archivo de encabezado &' # import' en el archivo .m. Me pregunto si hay algo análogo a '@ class' para' typedef enum's. – ma11hew28

Respuesta

14

no, no hay un equivalente.

enumeraciones en Objective-C son los mismos que las enumeraciones en C. Dado que el tipo subyacente de una enumeración es dependiente de la implementación (por ejemplo, podría ser char o int), el compilador debe conocer la declaración completa de la enumeración.

Dicho esto, un especificador de tipo

enum nameOfEnum 

sin enumerar los miembros de la enumeración es válida C siempre que aparece después de del tipo que especifica es completa, es decir, debe aparecer enum nameOfEnum { … } de antemano en la unidad de traducción.

En resumen: no hay una declaración de enumeraciones hacia adelante, solo referencias hacia atrás.

+0

¡Gracias !. Entonces, ¿debería seguir con el '# import'? – ma11hew28

+1

@Matt Yup. No hay nada más que puedas hacer, realmente. –

+0

@Bavarious Escuché que ObjectiveC ahora también tiene ventajas de C++ 11, por lo que admite enum de tipo fijo. – onmyway133

-1

Creo que lo que quiere es una clase que tenga PasscodeInputMode como una propiedad de la misma. De esta forma, puede pasar un objeto instanciado de esa clase, y puede establecer/obtener esa propiedad y hacer otros objetos similares (suponiendo que es por eso que desea encontrar un "equivalente de clase"

0

La declaración de clases hacia adelante es necesaria para permitir que dos clases se refieran entre sí. No es raro tener dos clases que se definen en términos de uno al otro:

@class ClassB; 

@interface ClassA : NSObject 
{ 
    ClassB *objectB; 
} 
@end 

@interface ClassB : NSObject 
{ 
    ClassA *objectA; 
} 
@end 

No hay ninguna manera de hacer que recopilan sin la declaración hacia adelante.

Lo mismo no ocurre con las enumeraciones. enum solo crea un conjunto de valores con nombre ... no puede incluir una enumeración en la definición de otro. Por lo tanto, nunca hay una necesidad de reenviar declarar una enumeración.

2

@Caleb, @Bavarious:

manera más reciente (enero de 2017) para reenviar declarar la enumeración (NS_ENUM/NS_OPTION) en Objective-C es el uso de lo siguiente:

// Forward declaration for XYZCharacterType in other header say XYZCharacter.h 
typedef NS_ENUM(NSUInteger, XYZCharacterType); 


// Enum declaration header: "XYZEnumType.h" 
#ifndef XYZCharacterType_h 
#define XYZCharacterType_h 

typedef NS_ENUM(NSUInteger, XYZEnumType) { 
    XYZCharacterTypeNotSet, 
    XYZCharacterTypeAgent, 
    XYZCharacterTypeKiller, 
}; 

#endif /* XYZCharacterType_h */` 

similares pregunta Forward-declare enum in Objective-C