检查是否存在目标c enum

时间:2013-02-13 12:24:36

标签: iphone ios objective-c

我为按钮ID预定了枚举:

typedef enum
{
    button1ID = 407,
    button2ID = 999,
    button3ID = 408,
    button4ID = 409,
} TOP_MENU_BUTTON_TYPE;

我需要查明我收到的ID是否在枚举中被定义。我怎样才能做到这一点?类似的东西:

if(id in TOP_MENU_BUTTON_TYPE)

7 个答案:

答案 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) ...