2010-03-21 5 views
31

Mon problème est qu'une énumération dans l'objectif-c est essentiellement une valeur int, je ne suis pas en mesure de le stocker dans un NSMutableArray. Apparemment, NSMutableArray ne prendra aucun type de données c comme un int.Comment stocker des valeurs enum dans un NSMutableArray

Existe-t-il un moyen commun d'y parvenir?

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]; 

Répondre

58

Enveloppez la valeur ENUM dans un NSNumber avant de le mettre dans le tableau:

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

Et le récupérer comme ce:

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

+1

En général, cela devrait être en sécurité, mais il y a des cas où il n'est pas, puisque les énumérations peuvent être représentés en interne comme une variété de types différents. Voir cette réponse pour une alternative http://stackoverflow.com/questions/1187112/cocoa-dictionary-with-enum-keys/1187901#1187901 – DougW

+0

Belle solution, merci –

2

Vous pouvez envelopper vos valeurs ENUM dans un objet NSNumber:

[NSNumber numberWithInt:green]; 
9

La réponse de Macatomy est correcte. Mais au lieu de NSNumber, je vous suggère d'utiliser NSValue. C'est son but dans la vie.

17

Une réponse moderne pourrait ressembler à:

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

et:

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

MyColors theGreenColor = ((NSInteger *) liste [0]) .intValue; Peut être remplacé par MyColors theGreenColor = (MyColors) [liste [0] intValue]; – Haider

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

Pour aller avec NSNumber devrait être la bonne façon normalement. Dans certains cas, il peut être utile de les utiliser comme NSString dans ce cas vous pouvez utiliser cette ligne de code:

[@(MyEnum) stringValue]; 
Questions connexes