繁体   English   中英

检查是否存在目标c enum

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM