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