2009-05-29 16 views
23

Così, ho questa definizione:Objective-C: NSString per enum

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

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

La domanda è: ho ricevuto il colore dell'auto in una NSString. Deve essere una NSString, non posso cambiarlo. Come posso convertire da NSString a car_colors?

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

qualche idea? grazie!

+0

Che cosa non funziona? Metti un punto di interruzione nel metodo in cui stai convertendo la stringa in un numero intero, dovresti essere in grado di vedere esattamente quale parte sta andando in tilt. –

risposta

18

Invece di utilizzare un array, perché non utilizzare un dizionario; Hai il colore NSString come chiavi e restituisci qualunque NSNumber desideri. Qualcosa di simile a; (A carica 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]; 
+0

Enum ha un significato diverso, non possiamo sostituire l'enum con NSArray o NSDictionary. Quando si sviluppano le librerie è necessario utilizzare i tipi di dati corretti. Questa non è una soluzione ottimale per questo. –

+5

@AntoBinishKaspar La domanda non riguardava una libreria in cui si trattava di lavorare attorno a un particolare problema con un particolare vincolo. E chi dice che non puoi sostituire un enum con un dizionario? Non sto parlando di un calo nella sostituzione, sto parlando di un modo diverso di affrontare una soluzione. – Abizern

7

È inoltre possibile inserire i valori in una matrice.

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

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

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1; 
-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 'se' lo stile, quello che se avessi mille colori? Non c'è una soluzione più automatica?

+4

Un dizionario - Come ho detto nella mia risposta. – Abizern

+0

Non ti voterò, ma quello che stai facendo è semplicemente sbagliato. La risposta di @ Tom è molto meglio di questo. –

46

ecco un'implementazione utilizzando NSDictionary e l'enumerazione esistente

nel file h:

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

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

nel file di .m: utilizzo

@implementation NSString (EnumParser) 

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

@end 

campione:

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

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

Questa dovrebbe essere la risposta accettata. Rendere i tuoi enummi Array o Dizionari non è un buon modo per affrontare questo problema. – lespommes

+0

Si noti che se i valori precisi dell'enumerazione non sono importanti, non è necessario specificare i valori. – ThomasW

3

Qui ci sono un sacco di ottime risposte: Converting between C enum and XML

Sono praticamente uguali a quelle di Abizern, ma sono un po 'più pulite e più facili da utilizzare se la tua app esegue questa conversione da stringa a enum molto. Esistono soluzioni che mantengono insieme le definizioni di stringhe e enum e i modi per rendere le conversioni ciascuna una singola riga di codice di facile lettura.

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

mia scelta =)