检查变量是否属于枚举值

时间:2012-11-03 18:23:59

标签: objective-c ios enums

是否有任何方法可以为枚举分配一组值,并检查变量在objective-c中的枚举中是否具有值。 如果对象存在于数组中,则可以获取数组中对象的索引。我想给出一个共同的行为,当我在表视图中点击某些索引(可能没有按顺序)时,想要避免if-ing所有索引,希望我可以使用枚举样式。

3 个答案:

答案 0 :(得分:2)

与大多数编程语言一样,Objective-C不为基本类型提供“类型成员资格”测试 - 仅针对对象类型(例如isKindOfClass:) - 所以使用enum不会解决你的问题。

但是,考虑到你首先想到的是enum,你可能会想要检查一小组固定的值。在这种情况下,您可以使用静态数组,例如类似的东西:

static NSUInteger indices[] = { 2, 42, 57 };

此类数组中的值的数量由sizeof(indices) / sizeof(NSUInteger给出,您可以编写一个简单的循环或二进制搜索来测试成员资格。

如果您希望使用对象,那么NSSet是一个不错的选择,如果数字在执行期间会有所不同NSMutableSet。 E.g。

NSSet *indices = [NSSet setWithObjects:@2, @42, @57, nil];

您使用member:测试会员资格:

if ([indices member:@indexToTest] != nil) ...

(注意:与NSArray不同,containsObject:的{​​{1}}规范表示它使用NSSet,因此使用{{ 1}}这里。)

答案 1 :(得分:1)

您不能使用enum,因为您无法枚举或呼叫某事。就像contains一样。如果我理解你的正确,我认为直接的方法就是使用NSArray来存储你关心的指数。假设您想要识别指数2,6和14:

NSArray *indices = [NSArray arrayWithObjects: @2, @6, @14, nil];

@是必要的,因为NSArray只能存储对象。@将整数转换为NSNumber个实例。

然后检查您使用的当前所选索引是否在其中:

int indexToCheck = ...;
BOOL indexIsInArray = [index containsObject:@(indexToCheck)];

如果您正在寻找更“花哨”(并且更快)的方式,您可以使用位操作(再次使用2,6和14作为示例):

int indices = 1 << 2 | 1 << 6 | 1 << 14;

然后检查:

int indexToCheck = ...;
BOOL isValid = (1 << indexToCheck) & indices;

isValid中的indexToCheck indices时,{{1}}为真。

答案 2 :(得分:0)

不,内部枚举基于整数,映射在编译时发生。因此,您需要针对每个枚举类型进行特定检查(如果它们是连续数字,则“&gt;”和“&lt;”检查将会执行)。