2010-03-21 21 views
31

Mi problema es que una enumeración en objetivo-c es esencialmente un valor int, no puedo almacenarlo en un NSMutableArray. Aparentemente NSMutableArray no tomará ningún tipo de datos c como un int.Cómo almacenar valores enum en un NSMutableArray

¿Hay alguna forma común de lograr esto?

typedef enum 
{ 
    green, 
    blue, 
    red 

} MyColors; 


NSMutableArray *list = [[NSMutableArray alloc] initWithObjects: 
          green, 
          blue, 
          red, 
          nil]; 

//Get enum value back out 
MyColors greenColor = [list objectAtIndex:0]; 

Respuesta

58

Envolver el valor de enumeración en un NSNumber antes de meterla en la matriz:

NSNumber *greenColor = [NSNumber numberWithInt:green]; 
NSNumber *redColor = [NSNumber numberWithInt:red]; 
NSNumber *blueColor = [NSNumber numberWithInt:blue]; 
NSMutableArray *list = [[NSMutableArray alloc] initWithObjects: 
          greenColor, 
          blueColor, 
          redColor, 
          nil]; 

y recuperarlo como esto:

MyColors theGreenColor = [[list objectAtIndex:0] intValue];

+1

En general, esta debe ser seguro, pero hay casos en que no lo es, ya que las enumeraciones pueden ser representados internamente como una variedad de diferentes tipos. Vea esta respuesta para una alternativa http://stackoverflow.com/questions/1187112/cocoa-dictionary-with-enum-keys/1187901#1187901 – DougW

+0

Buena solución, gracias –

2

Usted puede envolver sus valores de enumeración en un objeto NSNumber:

[NSNumber numberWithInt:green]; 
9

La respuesta de Macatomy es correcta. Pero en lugar de NSNumber, le sugiero que use NSValue. Ese es su propósito en la vida.

17

Una respuesta moderna podría ser:

NSMutableArray *list = 
[NSMutableArray arrayWithArray:@[@(green), @(red), @(blue)]]; 

y:

MyColors theGreenColor = ((NSInteger*)list[0]).intValue; 
+1

MyColors theGreenColor = ((NSInteger *) list [0]) .intValue; Se puede reemplazar por MyColors theGreenColor = (MyColors) [list [0] intValue]; – Haider

7
NSMutableArray *corners = [[NSMutableArray alloc] initWithObjects: 
          @(Right), 
          @(Top), 
          @(Left), 
          @(Bottom), nil]; 
Corner cornerType = [corner[0] intValue]; 
0

para ir con NSNumber debe ser el camino correcto con normalidad. En algunos casos puede ser útil para utilizarlos como NSString por lo que en este caso se podría utilizar esta línea de código:

[@(MyEnum) stringValue]; 
Cuestiones relacionadas