【问题标题】:Check if a objective c enum exists检查是否存在目标 c 枚举
【发布时间】:2013-02-13 12:24:35
【问题描述】:

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

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

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

if(id in TOP_MENU_BUTTON_TYPE)

【问题讨论】:

  • Find int value in enum的可能重复
  • 很遗憾,这个问题没有令人满意的答案。没有动态功能。所有建议都使用枚举的硬编码值。
  • 跳过 999 以便所有值都是连续的,没有跳过。然后在末尾添加“buttonEnumMax”。检查零和“buttonEnumMax”之间的数字。
  • ID 对我来说是随机数
  • 然后检查该值是否是随机的。 ;)

标签: iphone ios objective-c


【解决方案1】:

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

您在赏金中声明的此要求是不可能的:

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


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

【讨论】:

  • @Luda 不管你的赏金有多大,这将是答案。
  • 您如何看待 R.A 提供的答案?
  • 太丑了。 1. 它基于为每个 enum 声明 struct,因此它不再是 enum 2. 如果您为每个枚举创建这样的结构,您将使用 不仅仅是类型,而是还对所有值进行重复编码。我想你想避免这种情况。否则,您也可以在此处使用其他一些答案。 3. 你告诉我们你只是得到了另一个程序员声明的枚举。如果您可以修改代码并将其更改为struct您也可以更改值,或者以一些真正的Objective-C 方式。例如NSArrayNSDictionary 就像这里提供的答案一样。
  • 对。情况很简单。 OP是初学者,还没有听说过NSDictionary的神奇之处。幸运的是,使用 NSDictionary 非常容易。 (奇怪的是,比枚举容易得多!)这是一个完美的初学者关于字典的帖子。 stackoverflow.com/a/1760384/294884
【解决方案2】:

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

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

Change enum values at runtime?

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

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

【讨论】:

  • 如果我的解释很糟糕,那么继续链接。
  • 看起来是最正确的答案。但有些事情我做错了。看:在.h:i49.tinypic.com/2j5ctxd.png在.m:i48.tinypic.com/p99pf.png
  • 我明白了。在您的第一张图片中,只需在结构之前看到 typedef 关键字。删除它并尝试。这样就可以了
  • 成功了。我真的希望我可以使用枚举找到答案。但那是封闭的
【解决方案3】:

你可以这样做:

int validValue = button1ID | button2ID | button3ID | button4ID;
if (validValue & id)
    // Valid enum value

【讨论】:

  • 请参阅赏金说明:在您的回答中不要使用枚举的硬编码值,只使用它的类型。
【解决方案4】:

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

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

【讨论】:

  • 正如您在示例中看到的,我的值是预定义的。那我该怎么办?
  • 因此,您需要提供低级代码来进行检查。即if ((value != button1ID) && (value != button2ID) && ...) printf("the value is not in my enum");。也许您还有其他选择,例如将每个按钮的实际 id(不是这个数值,obj-c 分配的 id)与您的数字 id(作为 NSNumber)一起添加到 NSDictionary,并且然后检查字典中的 id。
  • 我不明白替代方案,反正应该是动态的
  • 您能否为此提供一个代码示例:也许您还有其他选择,例如将每个按钮的实际 id(不是这个数值,obj-c 分配的 id)添加到 NSDictionary使用您的数字 id(作为 NSNumber),然后检查字典中的 id。 ?
  • 代码并没有那么复杂,但是你最好自己写,这样你一定能看懂。 gnustep.it/nicola/Tutorials/BasicClasses/node28.html 是使用 NSMutableDictionary 的示例(用于在运行时动态修改字典),stackoverflow.com/questions/1760371/… 显示定义静态 NSDictionary。您可以使用 NSDictionary 的 - (id)objectForKey:(id)aKey 方法来确定您的数字 id 是否在字典中(作为 NSNumber 对象)
【解决方案5】:

试试这个方法:

-(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
} 

【讨论】:

  • 它看起来像 wright 方向,但它不是动态的。如果我明天要添加更多按钮,我不想更改功能。
  • @Luda - 有时你得不到你想要的。
  • 现在放弃还为时过早:)
  • Luda,使用 NSDictionary 即可。非常简单stackoverflow.com/a/1760384/294884
【解决方案6】:

在.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;
    }

【讨论】:

    【解决方案7】:

    关于在if 中使用switch|| 的答案是正确的,但是……

    如果你有大枚举(有很多值的枚举),你可以让它变得更简单。 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) ...
    

    【讨论】:

    • 嗨 iMartin。这些值没有排序
    • 我明白了,在您的示例中它们不是,但通常这是检查值是否在枚举中的一种非常简单的方法。
    • Luda,你为什么不把值排序? button2ID 应该是 999 似乎没有充分的理由,而且 iMartin 的回答很简单而且效果很好。
    • 因为提供价值的不是我
    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多