枚举字符串比较

时间:2010-01-17 22:04:10

标签: c objective-c

我需要将enum作为一个整体与一个字符串进行比较,因此会检查枚举的全部内容。

想要类似的东西:

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


typedef enum {
oneGreen,
twoBlue, 
threeSilver
}numbersAndColours;

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

但显然我不能这样做,也许是结构...... 对不起,我是C的新手请帮忙吗?

BTW:我知道NSString不是C,但认为这个问题比Obj-C更多。

由于

3 个答案:

答案 0 :(得分:3)

在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不匹配。没有必要将它与所有元素进行比较。

答案 1 :(得分:2)

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);

基本目标-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 
}

答案 2 :(得分:1)

我不确定我理解你想要达到的目标,但你可能想看看NSSet。如果colString是特定值,您似乎希望您的程序执行很酷的工作。

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

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

当您只想知道某个特定对象是否存在时,NSSetNSArray更快,但NSSet的一个重要方面是它不保持顺序对象。它通常在您不关心订单时使用,只是想测试一个对象何时存在于集合中。