1

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

4

3 回答 3

2

与大多数编程语言一样,Objective-C 不为原始类型提供“类型成员资格”测试——仅针对对象类型(例如isKindOfClass:)——因此使用 anenum不会解决您的问题。

但是,鉴于您enum首先考虑的是一个,听起来您有一小部分要检查的固定值。在这种情况下,您可以只使用静态数组,例如:

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

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

如果您希望使用对象 thenNSSet是一个不错的选择,如果在执行过程中数字会发生变化,那么NSMutableSet. 例如

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

并且您使用以下方法测试成员资格member:

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

(注意:与forNSArray的规范不同,它没有说它使用,因此在这里使用。)containsObject:NSSetisEqual:member:

于 2012-11-04T04:16:09.217 回答
1

你不能使用 an enum,因为你不能枚举它们或调用 sth。喜欢contains他们。如果我理解正确,我认为直接的方法就是使用 anNSArray来存储您关心的索引。假设您要识别索引 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是真的。indexToCheckindices

于 2012-11-03T19:13:05.593 回答
0

不,内部枚举基于整数,并且映射发生在编译时。因此,您需要对每种枚举类型进行特定检查(如果它们是连续数字,则可以使用“>”和“<”检查)。

于 2012-11-03T19:13:09.593 回答