сравнение строк перечисления - PullRequest
5 голосов
/ 18 января 2010

Мне нужно сравнить перечисление в целом с одной строкой, чтобы проверить все содержимое перечисления.

Требуется что-то вроде:

NSString *colString = [[NSString aloc] initWithString:@"threeSilver"];


typedef enum {
oneGreen,
twoBlue, 
threeSilver
}numbersAndColours;

if (colString == numbersAndColours) {
//Do cool stuff
}

Но, очевидно, я не могу этого сделать, может быть, структура ... извините, я новичок в C, пожалуйста, помогите?

Кстати: я знаю, что NSString не C, но решил, что этот вопрос был больше C, чем Obj-C.

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 января 2010

В C вам нужно написать функцию для этого. По сути, это будет switch заявление.

char* colour_of(enum numbersAndColours c)
{
    switch( c ) {
    case oneGreen:
        return "oneGreen";
        break;
    case twoBlue:
        return "twoBlue";
        break;
    /* ... */
    default:
        return "donno";
    }
}

Вы можете использовать функцию тогда так:

{
    char* nac;
    nac = colour_of(numbersAndColours);
    if( strncmp(colString, nac, colStringLen) == 0 )
        /* ... */
}

Если colString не соответствует ни одному из элементов перечисления, оно не будет соответствовать numbersAndColours. Нет необходимости сравнивать его со всеми элементами.

2 голосов
/ 18 января 2010

C, ObjC и C ++ не поддерживают это напрямую, вам нужно создать явное отображение.

Пример с использованием простого C:

typedef struct { 
    numbersAndColours num;
    const char* const str;
} entry;

#define ENTRY(x) { x, #x }

numberAndColours toNum(const char* const s) {
    static entry map[] = {
        ENTRY(oneGreen),
        ENTRY(twoBlue),
        ENTRY(threeSilver)
    }; 
    static const unsigned size = sizeof(map) / sizeof(map[0]);

    for(unsigned i=0; i<size; ++i) {
         if(strcmp(map[i].str, s) == 0) 
             return map[i].num;
    }

    return -1; // or some other value thats not in the enumeration
}

#undef ENTRY

// usage:

assert(toNum("oneGreen") == oneGreen); 
assert(toNum("fooBar") == -1);

Основной подход Objective-C:

#define ENTRY(x) [NSNumber numberWithInt:x], @#x

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
    ENTRY(oneGreen),
    ENTRY(twoBlue),
    ENTRY(threeSilver),
    nil];

#undef ENTRY

if([dict objectForKey:@"oneGreen"]) {
    // ... do stuff 
}
1 голос
/ 18 января 2010

Я не уверен, что понимаю, чего вы пытаетесь достичь, но вам, возможно, захочется взглянуть на NSSet. Похоже, вы хотите, чтобы ваша программа делала классные вещи, если colString - это конкретное значение.

NSSet *numbersAndColors = [NSSet setWithObjects:@"oneGreen", @"twoBlue", @"threeSilver", nil];
NSString *colString = [[NSString alloc] initWithString:@"threeSilver"];

if ([numbersAndColors containsObject:colString])
{
    // do cool stuff
}

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

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