我为按钮ID预定了枚举:
typedef enum
{
button1ID = 407,
button2ID = 999,
button3ID = 408,
button4ID = 409,
} TOP_MENU_BUTTON_TYPE;
我需要查明我收到的ID是否在枚举中被定义。我怎样才能做到这一点?类似的东西:
if(id in TOP_MENU_BUTTON_TYPE)
答案 0 :(得分:2)
无法动态迭代枚举。枚举是静态功能,它们在运行时不存在。在运行时,它们只是普通的整数(有些大小)和值。
你在赏金中声明这个要求:
在你的回答中,不要使用枚举的硬编码值,只是它的类型。
其他答案向您展示了静态的所有方法。
答案 1 :(得分:1)
你可以这样做:
int validValue = button1ID | button2ID | button3ID | button4ID;
if (validValue & id)
// Valid enum value
答案 2 :(得分:1)
如果我清楚地理解你的问题,那么这对你有帮助..
不应单独使用enum
,而应使用struct
进行尝试,这里@Richard的答案将帮助您完成此操作。
Change enum values at runtime?
https://stackoverflow.com/a/10305425/1083859
在上面的链接中,他解释了如何在enum
中使用动态struct
值,并且您可以iterate
找出值。我想你会有个主意。
答案 3 :(得分:0)
enum
不是对象,它只是编译器在构建时理解的整数。因此,您需要提供低级代码来进行检查。
如果您没有预先定义枚举值,则它们将从0开始并增加1。这使您可以比较一个值,看它是否是< =你的最后一个元素。
答案 4 :(得分:0)
尝试这种方法:
-(BOOL)isDefined:(TOP_MENU_BUTTON_TYPE)type{
BOOL isDefined;
switch (type) {
case button1ID:
case button2ID:
case button3ID:
case button4ID:
isDefined = TRUE;
break;
default:
isDefined = FALSE;
break;
}
return isDefined;
}
//(...)
TOP_MENU_BUTTON_TYPE test;
test = 407;
NSLog(@"is %d a TOP_MENU_BUTTON_TYPE? result: %d", test, [self isDefined:test]);
test = 2;
NSLog(@"is %d a TOP_MENU_BUTTON_TYPE? result: %d", test, [self isDefined:test]);
这样:
if ([self isDefined:test]){
// OK, test is defined in TOP_MENU_BUTTON_TYPE
}
答案 5 :(得分:0)
in .h
typedef enum
{
407,
999,
408,
409,
} TOP_MENU_BUTTON_TYPE;
@interface CheckoutController : UIViewController{
TOP_MENU_BUTTON_TYPE type;
}
在.m
switch (status) {
case 407:
//Your Task
break;
case 999:
//Your Task
break;
case 408:
//Your Task
break;
case 409:
//Your Task
break;
}
答案 6 :(得分:0)
关于在switch
中使用||
或一堆if
的答案是正确的,但是......
如果您有大枚举(包含大量值的枚举),您可以简化这一过程。 Cocoa也使用了这个技巧。
您的枚举值必须加一个 然后添加枚举另外两个值:
typedef enum {
buttonIDMin = 407, // Lowest value
button1ID = 407,
button2ID = 408, // Incremented by ONE
button3ID = 409,
button4ID = 410,
buttonIDMax = 410, // Highest value
} TOP_MENU_BUTTON_TYPE;
进行比较时,您只需要这样做:
if (buttonID >= buttonIDMin && buttonID <= buttonIDMax) ...