Подтвердить что ты не робот

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

любая идея? спасибо!

4b9b3361

Ответ 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;

Но мне не нравится этот стиль "если", а что, если бы у меня было тысяча цветов? Нет ли более автоматического решения?