2010-03-21 11 views
31

Mój problem polega na tym, że wyliczenie w celu-c jest zasadniczo wartością int, nie jestem w stanie zapisać go w postaci NSMutableArray. Wygląda na to, że NSMutableArray nie przyjmuje żadnych typów danych c, takich jak int.Jak przechowywać wartości wyliczeniowe w NSMutableArray

Czy jest jakiś popularny sposób, aby to osiągnąć?

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

Odpowiedz

58

Wrap wartość enum w NSNumber przed wprowadzeniem go na tablicy:

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

i pobierać je jak to:

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

+1

Generalnie powinno być bezpieczne, ale są przypadki, gdy tak nie jest, ponieważ teksty stałe mogą być reprezentowane wewnętrznie jako różnorodność różnych typów. Zobacz tę odpowiedź, aby uzyskać alternatywny http://stackoverflow.com/questions/1187112/cocoa-dictionary-with-enum-keys/1187901#1187901 – DougW

+0

Dobre rozwiązanie, dzięki –

2

Można owinąć wartości enum w obiekcie NSNumber:

[NSNumber numberWithInt:green]; 
9

Odpowiedź Macatomy jest poprawna. Ale zamiast NSNumber sugerowałbym użyć NSValue. Taki jest cel życia.

17

Nowoczesny odpowiedź może wyglądać tak:

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

oraz:

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

MyColors theGreenColor = (lista (NSInteger *) [0]) .intValue; Może być zastąpiony przez MyColors theGreenColor = (MyColors) [lista [0] int Wartość]; – Haider

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

Aby przejść z NSNumber powinna być właściwa droga normalnie. W niektórych przypadkach może to być przydatne do wykorzystania ich jako NSString więc w tym przypadku można użyć tego wiersza kodu:

[@(MyEnum) stringValue]; 
Powiązane problemy