Objective-c: NSString для перечисления
Итак, у меня есть это определение:
typedef enum {
red = 1,
blue = 2,
white = 3
} car_colors;
Затем у меня есть переменная типа car_colors:
car_colors myCar;
Вопрос в том, что я получаю цвет автомобиля в NSString. Это должен быть NSString, я не могу это изменить. Как я могу конвертировать из NSString в тип car_colors?
NSString *value = [[NSString alloc] initWithString:@"1"];
myCar = [value intValue]; // <-- doesn't work
любая идея?
спасибо!
Ответы
Ответ 1
Вместо использования массива, почему бы не использовать словарь; У вас есть цвет NSString как ключи, и вы возвращаете нужный NSNumber. Что-то вроде; (Длинные намотки для ясности).
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];
Ответ 2
здесь реализация с использованием NSDictionary
и существующего перечисления
в .h файле:
typedef NS_ENUM(NSInteger, City) {
Toronto = 0,
Vancouver = 1
};
@interface NSString (EnumParser)
- (City)cityEnumFromString;
@end
в .m файле:
@implementation NSString (EnumParser)
- (City)cityEnumFromString{
NSDictionary<NSString*,NSNumber*> *cities = @{
@"Toronto": @(Toronto),
@"Vancouver": @(Vancouver),
};
return cities[self].integerValue;
}
@end
Использование образца:
NSString *myCity = @"Vancouver";
City enumValue = [myCity cityEnumFromString];
NSLog(@"Expect 1, Actual %@", @(enumValue));
Ответ 3
Вы также можете поместить значения в массив.
NSArray *carColorsArray = @[@"red", @"blue", @"white"];
Затем вы можете использовать indexOfObject для получения индекса определенной строки.
car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1;
Ответ 4
Здесь есть много отличных ответов: Преобразование между C перечислением и XML
Они в основном такие же, как у Abizern, но немного чище и проще в работе, если ваше приложение сильно преобразует это преобразование строки в enum. Существуют решения, которые содержат описания строк и перечислений вместе, и способы сделать конверсии каждой простой, легко читаемой строкой кода.
Ответ 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];
}
// ...
Мой выбор =)
Ответ 6
Я нашел решение:
if ([car_color isEqualToString:@"1"])
return red;
if ([tipo_pdi isEqualToString:@"2"])
return blue;
if ([tipo_pdi isEqualToString:@"3"])
return white;
Но мне не нравится этот стиль "если", а что, если бы у меня было тысяча цветов? Нет ли более автоматического решения?