我想有一个标识符一次负责多个值。如果我有一个这是我能做的:
if (myVariable == IDENTIFIER)//instead of if(myVariable == 5 || myVariable == 7) if i need A LOT of values
[myObject doSomething];
是否有可能以某种方式实施它?
答案 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个元素作为参数是一个字符),因此测试集合的成员资格只是一个数组索引操作。