web-dev-qa-db-fra.com

Objective-C: Nstring à Enum

Donc, j'ai cette définition:

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

Ensuite, j'ai une variable de type car_colors: car_colors mycar;

La question est que je reçois la couleur de la voiture dans une nstring. Ce doit être un nstring, je ne peux pas changer cela. Comment puis-je convertir de Nstring en type Car_Colors?

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

une idée? Merci!

25
Hectoret

Plutôt que d'utiliser un tableau, pourquoi ne pas utiliser un dictionnaire; Vous avez la couleur nstring comme des clés et vous retournez tout ce que vous voulez. Quelque chose comme; (Long de la clarté).

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

Vous pouvez également mettre les valeurs dans un tableau.

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

Vous pouvez ensuite utiliser IndexOfObject pour obtenir l'index d'une chaîne particulière.

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1;
8
Tom Jefferys

Il y a beaucoup de bonnes réponses à cela ici: Conversion entre C Enum et XML

Ils sont fondamentalement identiques à ceux d'Abizern, mais sont un peu plus propres et plus faciles à travailler avec si votre application fait beaucoup de conversion à la chaîne à l'autre. Il existe des solutions qui maintiennent les définitions de chaîne et d'énumération ensemble et des moyens de faire la conversion une ligne de code unique et facile à lire.

3
andyvn22
// ...
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];
}
// ...

Mon choix =)

1
uranpro