2010-01-22 25 views
11

Quiero declarar una enumeración personalizada tales como:¿Cómo declarar una propiedad de clase como un tipo de enumeración

enum menuItemType 
{ 
    LinkInternal = 0, 
    LinkExternal = 1, 
    Image = 2, 
    Movie = 3, 
    MapQuery = 4 
} 

Como un tipo de mi objetivo:

@interface MenuItem : NSObject {  
    NSMutableString *menuId; 
    NSMutableString *title; 
    enum menuItemType *menuType; 
    NSMutableArray *subMenuItems; 
} 

Pero estoy seguro de que me es necesario poner la definición de enumeración: si la coloco antes de la interfaz @ es sintácticamente incorrecta

Respuesta

10

Si coloca los dos fragmentos de código en un archivo en este orden, solo tiene que agregar un ; al final o f la declaración enum y es posible que desee considerar el uso de una variable enum en lugar de un puntero a una variable enum.

Esto da:

enum menuItemType 
{ 
    LinkInternal = 0, 
    LinkExternal = 1, 
    Image = 2, 
    Movie = 3, 
    MapQuery = 4 
}; 

@interface MenuItem : NSObject {  
    NSMutableString *menuId; 
    NSMutableString *title; 
    enum menuItemType menuType; 
    NSMutableArray *subMenuItems; 
} 
+0

gracias Im un poco de un novato obj-c por lo que aprender rápidamente gracias –

+1

esta respuesta está desactualizada, utilice el moderno 'NS_ENUM'. Mire la respuesta de @Zedenem –

+0

@ proca2.0 - Tiene razón, gracias por señalar esto. De hecho, todo Objective-C está en camino a ser obsoleto. – mouviciel

5

@mouviciel es correcto, pero pensé en hacerle saber que lo que quiere no es una propiedad de clase, algo que no es soportado en Objective-C. Una propiedad de clase es en realidad una propiedad global que se establece en el objeto de clase. Lo que estabas pensando era una propiedad simple (establecida en una instancia de la clase).

Además, lo que muestra el código es que solo está usando una variable de instancia. Las variables de instancia se puede convertir en propiedades mediante la adición de métodos de acceso/mutadores de la siguiente manera:

// after @interface {} 
@property (readwrite) enum menuItemType menuType; 

y

// under @implementation 
@synthesize menuType; 

Este es un acceso directo: el compilador generará los métodos adecuados para acceder y cambiar la propiedad menuType . No estoy seguro de cuán útil es todo esto para ti, pero te ayudará con tu comprensión de la semántica de Objective-C.

15

Simplemente actualizando esto en caso de que alguien se tropiece con esto en nuestros tiempos futuros.

Desde iOS 6/Mac OS X 10.8, los nuevos NS_ENUM y NS_OPTIONS macros son la forma preferida para declarar tipos de enumeración.

En ese caso, se vería así:

typedef NS_ENUM(NSInteger, MenuItemType) { 
    LinkInternal = 0, 
    LinkExternal = 1, 
    Image = 2, 
    Movie = 3, 
    MapQuery = 4 
}; 

@interface MenuItem : NSObject {  
    NSMutableString *menuId; 
    NSMutableString *title; 
    MenuItemType menuType; 
    NSMutableArray *subMenuItems; 
} 

Una buena lectura sobre el tema: http://nshipster.com/ns_enum-ns_options/

Usted también puede ajustarse a las convenciones de Apple para nombrar enumeración e ir a por algo así como:

typedef NS_ENUM(NSInteger, MenuItemType) { 
    MenuItemTypeLinkInternal = 0, 
    MenuItemTypeLinkExternal = 1, 
    MenuItemTypeImage = 2, 
    MenuItemTypeMovie = 3, 
    MenuItemTypeMapQuery = 4 
}; 

Espero que esto ayude.

+0

Estaba a punto de reñirte por chocar con una publicación que era tan antigua ... pero en serio, esto es increíble. Acabo de convertir mi proyecto actual. Amo las NS_OPCIONES también. – Fogmeister

Cuestiones relacionadas