一个标识符代表多个值.有可能吗



我希望一个标识符一次负责多个值。如果我有一个,这就是我可以做的:

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

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

我认为最接近的方法是使用位掩码,这样你就可以用一个包含所有值的掩码来表示允许值集:

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

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

您可以有一个可能值的NSSet

NSSet *possibleValues = [NSSet setWithObjects:@"Value1", @"Value2", @"Value3", nil];
if ([possibleValues containsObject:myVariable])

如果你需要一个能处理原始整数的东西,请告诉我。

这就是方法的用途:

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

组合答案。首先使用一个函数(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个元素作为参数是一个字符),因此测试集合的成员资格只是一个数组索引操作。

最新更新