簡體   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