2010-07-03 15 views
5

Soy nuevo en Objective-C, pero tengo experiencia en C++ y C.¿Enumeras la tienda en un NSArray?

Quiero almacenar algunas constantes enum en una matriz. En C++ me gustaría hacer algo como esto:

enum color {RED, BLUE, YELLOW, GREEN}; 
vector<color> supportedColors; 
supportedColors.push_back(RED); 
supportedColors.push_back(GREEN); 

Pero el NSArray hará solamente los indicadores del almacén de objetos (id's). Entonces, ¿cómo deberían almacenarse? Posiblemente podría convertirlos en enteros y almacenarlos en un objeto NSNumber, pero esto parece desordenado.

Me pregunto que experimentó programadores obj-c hacer?

Respuesta

13

las echó en números enteros y almacenarlos en NSNumbers. :)

tipos

nativo C son realmente ciudadanos de segunda clase en las clases de colección de cacao, y son a menudo detallado para trabajar con si usted quiere mezclarse. C dice que las enumeraciones tienen valores integrales, por lo que es seguro usarlas de esta manera.

Dependiendo de lo que esté haciendo, por supuesto, puede simplificar el código de manipulación envolviendo esa enumeración en un objeto real ("MiColor") que tiene la enumeración como una propiedad en él. A continuación, estos objetos podrían distribuirse en las clases de recopilación como se desee, con algunos gastos indirectos iniciales y en tiempo de ejecución que probablemente no importen desde el punto de vista del rendimiento, según lo que esté haciendo.

+0

¿Hay un buen tipo Obj-C para algo que pueda usar en un interruptor ... caso y también puso en una NSArray? – joerick

+0

@joerick: 'NSNumber' se puede usar con sentencias' switch': 'switch ([myNsNumber intValue]) ...'. –

+0

Por supuesto. ¡Gracias chicos! – joerick

0

me gustaría hacer una nueva clase define la enumeración, y luego instanciar colores soportados como

vector<colorEnumClass> supportedColours

a continuación, puede hacer cosas como: dar a los métodos de la clase para probar un color para ver si se trata de una miembro del vector ... entonces puede usar ese método en las declaraciones IF en lugar de pruebas explícitas utilizando operadores relacionales. codificación más claro :-)

aviso de que los supportedColours nombre sugiere que este vector debe ser una constante, definida al inicio del programa y nunca ha cambiado. Si este es el caso, entonces los "colores" en el vector deberían establecerse en el constructor y nunca cambiarse. La clase debe implementarse como Singleton e incluso puede anular los operadores vectoriales de pushback(), etc. para bloquear modificaciones.

Esta es la naturaleza de la "new" Java enumeration technology

También debería mencionar que soy demasiado nuevo en Objective C para proporcionar un ejemplo de código sintácticamente correcto .. lo siento.

+2

La pregunta no era sobre soluciones en C++ - 'vector ' es un ejemplo de C++ de lo que quiere hacer en ObjC. –

0

Usted está buscando quizá una manera de simplemente bucle a través de todas las opciones? ¿Qué tal solo un plan viejo y normal?

typedef enum {RED,BLUE,GREEN,YELLOW} color; 

color colors[4]={RED,YELLOW,GREEN,BLUE}; 
for (int i=0;i<4;i++) 
    colors[i]; 

Por otro lado, si el rendimiento no es un problema y usted solo está buscando limpiar el código un poco; ¿Qué hay de la creación de una clase ColorArray que encapsula NSMutableArray y crea los métodos pertinentes.

ColorArray.h:

#import <Foundation/Foundation.h> 

typedef enum {RED,BLUE,GREEN,YELLOW} Color; 

@interface ColorArray : NSObject { 
    NSMutableArray* _array; 
} 

- (id) initWithArray:(Color[])colors; 

- (void) addColor:(Color)color; 
- (Color) colorAtIndex:(int)i; 

@end 

ColorArray.c:

#import "ColorArray.h" 

@implementation ColorArray 

- (id) init { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
- (id) initWithArray:(Color[])colors { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
     for (int i=0;colors[i]!=0;i++) 
      [_array addObject:[NSNumber numberWithInt:colors[i]]]; 
    } 
    return self; 
} 
- (void) dealloc { 
    [_array release]; 
    [super dealloc]; 
} 

- (void) addColor:(Color)color { 
    [_array addObject:[NSNumber numberWithInt:color]]; 
} 
- (Color) colorAtIndex:(int)i { 
    return [[_array objectAtIndex:i] intValue]; 
} 

@end