5

我为按钮 ID 预定义了枚举:

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

我需要确定我收到的 ID 是否在枚举中被定义。我怎样才能做到这一点?就像是:

if(id in TOP_MENU_BUTTON_TYPE)
4

7 回答 7

2

没有办法动态迭代枚举。枚举是静态功能,它们在运行时不存在。在运行时,它们只是普通的整数(一定大小)和值。

您在赏金中陈述的这个要求是不可能的:

在您的回答中,不要使用枚举的硬编码值,只使用它的类型。


其他答案向您展示了几乎所有静态方法。

于 2013-02-18T08:22:39.927 回答
1

你可以简单地这样做:

int validValue = button1ID | button2ID | button3ID | button4ID;
if (validValue & id)
    // Valid enum value
于 2013-02-19T15:35:31.630 回答
1

如果我清楚地理解您的问题,那么这将对您有所帮助..

而不是enum单独使用,您应该尝试使用struct它,@Richard 的答案将帮助您如何做到这一点。

在运行时更改枚举值?

https://stackoverflow.com/a/10305425/1083859

在上面的链接中,他解释了如何使用动态enum值,struct您也可以iterate找出这些值。我想你会有一个想法。

于 2013-02-20T07:31:49.643 回答
0

Anenum不是对象,它只是编译器在构建时理解的整数。因此,您需要提供低级代码来进行检查。

如果您没有预先定义枚举的值,它们将从 0 开始并增加 1。这使您可以比较一个值以查看它是否是 <= 您的最后一个元素。

于 2013-02-13T12:30:45.040 回答
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
} 
于 2013-02-13T12:50:42.943 回答
0

在.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;
    }
于 2013-02-13T12:54:44.333 回答
0

switch关于 using或一堆||in的答案if是正确的,但是……</p>

如果你有很大的枚举(有很多值的枚举),你可以让它更简单。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) ...
于 2013-02-17T09:47:05.243 回答