我希望一个标识符一次负责多个值。如果我有一个,这就是我可以做的:
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个元素作为参数是一个字符),因此测试集合的成员资格只是一个数组索引操作。