[英]Check if a objective c enum exists
我为按钮ID预定了枚举:
typedef enum
{
button1ID = 407,
button2ID = 999,
button3ID = 408,
button4ID = 409,
} TOP_MENU_BUTTON_TYPE;
我需要找出我收到的ID是否在enum中被诽谤。 我怎样才能做到这一点? 就像是:
if(id in TOP_MENU_BUTTON_TYPE)
没有办法动态迭代枚举。 枚举是静态功能 ,它们在运行时不存在。 在运行时,它们只是普通整数(有些大小)和值。
你在赏金中说明这个要求是不可能的:
在你的回答中,不要使用枚举的硬编码值,只是它的类型。
其他答案显示了几乎所有静态处理方式 。
你可以这样做:
int validValue = button1ID | button2ID | button3ID | button4ID;
if (validValue & id)
// Valid enum value
如果我清楚地理解你的问题,那么这对你有帮助..
不应该单独使用enum
,而应该尝试使用struct
,这里@Richard的回答将帮助您如何做到这一点。
https://stackoverflow.com/a/10305425/1083859
在上面的链接中,他解释了如何使用struct
的动态enum
值,并且您可以iterate
值以找出。 我想你会有个主意。
enum
不是对象,它只是编译器在构建时理解的整数。 因此,您需要提供低级代码来进行检查。
如果您没有预先定义枚举值,则它们将从0开始并增加1。 这使您可以比较一个值,看它是否<=您的最后一个元素。
试试这个方法:
-(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
}
在.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;
}
关于使用switch
或一堆||
答案 if
是正确的,但......
如果你有大的枚举 (枚举有很多值)你可以使这更简单。 Cocoa也使用这个技巧。
您的枚举值必须加1 。
然后添加枚举两个附加值:
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) ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.