我需要将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更多。
由于
答案 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
}
当您只想知道某个特定对象是否存在时,NSSet
比NSArray
更快,但NSSet
的一个重要方面是它不保持顺序对象。它通常在您不关心订单时使用,只是想测试一个对象何时存在于集合中。