2009-05-29 14 views
23

Tak, mam tę definicję:Objective-c: NSString do wyliczenia

typedef enum { 
    red = 1, 
    blue = 2, 
    white = 3 
} car_colors; 

Następnie mam zmienna typu car_colors: car_colors mojeAuto;

Pytanie brzmi: otrzymuję kolor samochodu w NSString. To musi być NSString, nie mogę tego zmienić. Jak mogę przekonwertować NSString na typ car_colors?

NSString *value = [[NSString alloc] initWithString:@"1"]; 
myCar = [value intValue]; // <-- doesn't work 

jakiś pomysł? dzięki!

+0

Co dokładnie nie działa? Umieść punkt przerwania w metodzie, w której konwertujesz ciąg na liczbę całkowitą, powinieneś być w stanie dokładnie zobaczyć, która część idzie w szał. –

Odpowiedz

18

Zamiast używać tablicy, dlaczego nie używać słownika; Masz kolor NSString jako klucze i zwracasz wszystkie NSNumber, które chcesz. Coś jak; (Długo zdyszany dla jasności).

NSDictionary *carColourDictionary = @{@"Red": @1, 
             @"Blue": @2, 
             @"White": @3}; 

// Use the dictionary to get the number 
// Assume you have a method that returns the car colour as a string: 
// - (NSString *)colourAsString; 
int carColour = carColourDictionary[object colourAsString]; 
+0

Enum ma inne znaczenie, nie możemy zastąpić wyliczenia NSArray lub NSDictionary. Kiedy tworzysz biblioteki, musisz używać właściwych typów danych. To nie jest optymalne rozwiązanie. –

+5

@AntoBinishKaspar Pytanie nie dotyczyło biblioteki, która dotyczyła pracy z określonym problemem z konkretnym ograniczeniem. A kto powiedział, że nie możesz zastąpić enum słownikiem? Nie mówię o kropli wymiany, mówię o innym sposobie podejścia do rozwiązania. – Abizern

7

Można również umieścić wartości w tablicy.

NSArray *carColorsArray = @[@"red", @"blue", @"white"]; 

Następnie można użyć indexOfObject, aby uzyskać indeks konkretnego ciągu.

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1; 
-6

znalazłem rozwiązanie:

if ([car_color isEqualToString:@"1"]) 
     return red; 
if ([tipo_pdi isEqualToString:@"2"]) 
     return blue; 
if ([tipo_pdi isEqualToString:@"3"]) 
     return white; 

Ale ja nie lubię tego „czy” styl, co gdybym miał tysiąc kolory? Czy nie ma bardziej automatycznego rozwiązania?

+4

Słownik - jak powiedziałem w mojej odpowiedzi. – Abizern

+0

Nie będę cię głosował, ale to, co robisz, jest po prostu złe. Odpowiedź @Tom jest o wiele lepsza niż robienie tego. –

46

oto implementacja przy użyciu NSDictionary a istniejący wyliczenia

w pliku .h:

typedef NS_ENUM(NSInteger, City) { 
    Toronto   = 0, 
    Vancouver  = 1 
}; 

@interface NSString (EnumParser) 
- (City)cityEnumFromString; 
@end 

w .m pliku: Wykorzystanie

@implementation NSString (EnumParser) 

- (City)cityEnumFromString{ 
    NSDictionary<NSString*,NSNumber*> *cities = @{ 
          @"Toronto": @(Toronto), 
          @"Vancouver": @(Vancouver), 
          }; 
    return cities[self].integerValue; 
} 

@end 

próbki:

NSString *myCity = @"Vancouver"; 
City enumValue = [myCity cityEnumFromString]; 

NSLog(@"Expect 1, Actual %@", @(enumValue)); 
+0

To powinna być zaakceptowana odpowiedź. Tworzenie podsumowań Tablice lub słowniki nie są dobrym sposobem podejścia do tego problemu. – lespommes

+0

Pamiętaj, że jeśli dokładne wartości wyliczenia nie są ważne, nie musisz podawać wartości. – ThomasW

3

Istnieje wiele wspaniałych odpowiedzi na ten temat: Converting between C enum and XML

Są w zasadzie takie same jak w Abizern, ale są trochę bardziej przejrzyste i łatwiejsze w obsłudze, jeśli twoja aplikacja robi dużo konwersji. Istnieją rozwiązania, które zachowują razem definicje łańcuchów i wyliczeń oraz sposoby przekształcania każdego z nich w pojedynczą, łatwą do odczytania linię kodu.

1
// ... 
typedef enum { 
    One = 0, 
    Two, 
    Three 
} GFN; 
// ... 
#define kGFNPrefix @"GFNEnum_" 
// ... 
+ (NSString *)gfnToStr:(GFN)gfn { 
    return [NSString stringWithFormat:@"%@%d", kGFNPrefix, gfn]; 
} 

+ (GFN)gfnFromStr:(NSString *)str { 
    NSString *gfnStr = [str stringByReplacingOccurrencesOfString:kGFNPrefix withString:@""]; 
    return [gfnStr intValue]; 
} 
// ... 

Mój wybór =)