/ / Objective-c: NSString to enum - object-c, cacao, enums

Objective-c: NSString to enum - goal-c, cacao, enums

Quindi, ho questa definizione:

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

Quindi, ho una variabile di tipo car_colors: car_colors myCar;

La domanda è: ricevo il colore dell'auto in una NSString. Deve essere un NSString, non posso cambiarlo. Come posso convertire da NSString al tipo car_colors?

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

qualche idea? Grazie!

risposte:

18 per risposta № 1

Invece di usare un array, perché non usare un dizionario; Hai il colore NSString come chiavi e restituisci qualunque NSNumber desideri. Qualcosa di simile a; (A lungo avvolto per chiarezza).

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

47 per risposta № 2

ecco un'implementazione che utilizza NSDictionary e l'enum esistente

nel file .h:

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

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

nel file .m:

@implementation NSString (EnumParser)

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

@end

esempio di utilizzo:

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

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

7 per risposta № 3

È inoltre possibile inserire i valori in un array.

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

È quindi possibile utilizzare indexOfObject per ottenere l'indice di una stringa particolare.

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

3 per risposta № 4

Ci sono molte grandi risposte a questo qui: Conversione tra C enum e XML

Sono sostanzialmente uguali a quelli di Abizern, ma lo sonoun po 'più pulito e più facile da lavorare se la tua app esegue molto questa conversione da stringa a enum. Esistono soluzioni che tengono insieme le definizioni stringa ed enum e modi per rendere ciascuna conversione una singola riga di codice di facile lettura.


1 per risposta № 5
// ...
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];
}
// ...

La mia scelta =)


-6 per risposta № 6

Ho trovato la soluzione:

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

Ma non mi piace questo stile "if", e se avessi mille colori? Non esiste una soluzione più automatica?