2009-05-29 10 views
23

Por lo tanto, tengo esta definición:Objetivo-c: NSString es posible enumerar los

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

Entonces, tengo una variable de tipo car_colors: car_colors miCarro;

La pregunta es, recibo el color del coche en un NSString. Debe ser un NSString, no puedo cambiar eso. ¿Cómo puedo convertir de NSString a car_colors tipo?

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

¿idea? gracias!

+0

¿Qué es exactamente no funciona? Ponga un punto de interrupción en el método donde está convirtiendo la cadena en un número entero, debería poder ver exactamente qué parte se está volviendo loca. –

Respuesta

18

En lugar de utilizar una matriz, ¿por qué no utilizar un diccionario; Tiene el NSString de color como claves y devuelve el NSNumber que desee. Algo como; (Largo aliento para mayor claridad).

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 tiene un significado diferente, no podemos reemplazar la enumeración con NSArray o NSDictionary. Cuando desarrolles bibliotecas, debes usar los tipos de datos adecuados. Esta no es una solución óptima para eso. –

+5

@AntoBinishKaspar La cuestión no era sobre una biblioteca sobre la que se trataba de resolver un problema en particular con una restricción particular. ¿Y quién dice que no puedes reemplazar una enumeración con un diccionario? No estoy hablando de una caída en el reemplazo, estoy hablando de una forma diferente de abordar una solución. – Abizern

7

También podría poner los valores en una matriz.

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

Puede utilizar indexOfObject para obtener el índice de una cadena en particular.

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

he encontrado la solución:

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

Pero eso no me gusta este estilo 'si', lo que si tuviera mil colores? ¿No hay una solución más automática?

+4

Un diccionario - Como dije en mi respuesta. – Abizern

+0

No te votaré, pero lo que estás haciendo es simplemente incorrecto. La respuesta de @Tom es mucho mejor que hacer esto. –

46

aquí es una implementación usando NSDictionary y la enumeración existente

en el archivo .h:

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

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

en el archivo .m: el uso

@implementation NSString (EnumParser) 

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

@end 

muestra:

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

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

Esta debería ser la respuesta aceptada. Hacer tus enums Arrays o Dictionaries no es una buena forma de abordar este tema. – lespommes

+0

Tenga en cuenta que si los valores precisos de la enumeración no son importantes, entonces no necesita especificar los valores. – ThomasW

3

Aquí hay muchas respuestas excelentes aquí: Converting between C enum and XML

Básicamente son los mismos que los de Abizern, pero son un poco más limpios y fáciles de usar si su aplicación hace mucho esta conversión de cadena a enum. Existen soluciones que mantienen juntas las definiciones de cadena y enum, y formas de hacer que las conversiones sean una línea de código única y fácil de leer.

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

Mi elección =)

Cuestiones relacionadas