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 № 1Invece 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?