Objective-c: NSString для перечисления - PullRequest
25 голосов
/ 29 мая 2009

Итак, у меня есть это определение:

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

есть идеи? спасибо!

Ответы [ 6 ]

51 голосов
/ 26 июля 2009

вот реализация, использующая NSDictionary и существующий enum

в .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));
18 голосов
/ 29 мая 2009

Вместо использования массива, почему бы не использовать словарь; У вас есть цвет 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];
8 голосов
/ 29 мая 2009

Вы также можете поместить значения в массив.

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

Затем вы можете использовать indexOfObject, чтобы получить индекс конкретной строки.

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1;
3 голосов
/ 06 сентября 2009

Здесь есть много хороших ответов: Преобразование между C enum и XML

Они в основном такие же, как у Abizern, но они немного чище и с ними легче работать, если ваше приложение часто выполняет преобразование строк в перечисления. Существуют решения, которые объединяют определения строк и перечислений, а также способы сделать преобразования каждой отдельной, легко читаемой строкой кода.

1 голос
/ 08 декабря 2011
// ...
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];
}
// ...

Мой выбор =)

0 голосов
/ 29 мая 2009

Я нашел решение:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...