Цель-c: NSString к перечислению

I/p:- "ImageWideNice".scan(/[A-Z][a-z]+/).join(",")

O/p:- "Image,Wide,Nice"
25
задан FreeAsInBeer 31 January 2012 в 17:29
поделиться

5 ответов

Вместо того, чтобы использовать массив, почему бы не использовать словарь; У вас есть цвет 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];
18
ответ дан 28 November 2019 в 18:00
поделиться

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

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

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

car_colors carColor = [carColorsArray indexOfObject:@"blue"] + 1;
8
ответ дан 28 November 2019 в 18:00
поделиться

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

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

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

-6
ответ дан 28 November 2019 в 18:00
поделиться

вот реализация с использованием 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));
52
ответ дан 28 November 2019 в 18:00
поделиться

Здесь есть много отличных ответов: Преобразование между перечислением C и XML

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

3
ответ дан 28 November 2019 в 18:00
поделиться