多个值的一个标识符。可能吗?

时间:2012-01-30 15:59:26

标签: objective-c c

我想有一个标识符一次负责多个值。如果我有一个这是我能做的:

if (myVariable == IDENTIFIER)//instead of if(myVariable == 5 || myVariable == 7) if i need A LOT of values
    [myObject doSomething];

是否有可能以某种方式实施它?

4 个答案:

答案 0 :(得分:5)

我认为最接近的是使用位掩码,因此您可以使用具有所有值设置的掩码来表示允许值的集合:

const int ALL_VALUES = (1 << 5) | (1 << 7);
if ((1 << myVariable) & ALL_VALUES)
  [myObject doSomething];

以上,逐位AND用于计算当前值(视为1位掩码)与所有允许值的掩码之间的交集。请注意,这仅在值的数量(及其实际)小于int中的位数时才有效。

答案 1 :(得分:1)

您可以拥有NSSet个可能的值:

NSSet *possibleValues = [NSSet setWithObjects:@"Value1", @"Value2", @"Value3", nil];

if ([possibleValues containsObject:myVariable])

如果你需要一些适用于整数的东西,请告诉我。

答案 2 :(得分:1)

这是方法的用途:

- (BOOL)isFoo(int identifier) {
    return identifier == 5 || identifier == 7;
}

答案 3 :(得分:1)

结合答案。首先使用函数(grahamparks的变体):

BOOL isFoo(int identifier)
{
   ...
   return ...;
}

对于这个简单的函数可能比方法更好的东西 - 调用更快,并且不需要覆盖。此外,如果当前文件中只需要该功能,则声明它static BOOL isFoo...以限制isFoo仅对文件的可见性。

现在选择适合数据的身体 - 几个值,比较(grahamparks);超过几个值,但都在0-31(uint32_t)或0-63(uint64_t)内考虑位掩码(展开);在整个范围内的许多值都考虑了集合(Richard J. Ross III);或滚动你自己。您选择的算法的重点在功能中是独立的,如果需要可以轻松更改,而不会影响代码的其余部分。

如现有的类似示例,请考虑标准C库中的isDigit() 。这些实现使用预先分配的布尔数组(256个元素作为参数是一个字符),因此测试集合的成员资格只是一个数组索引操作。