来自一个极度被宠坏的家庭(turbo pascal, python, ruby),当涉及到自己做所有的家务时,我有点困惑。
昨天就是这样的一天,我就是找不到一个解决办法。我必须检查一个值是否与其他值匹配。
x = some_function_return_value();
if x in (1,4,17,29,35):
我过去就是这么写的。Objective-C显然不能这样做。我搜索了旧的谷歌,但没有找到答案,旧的手册,什么都没有,那么你如何在Objective-C中做到这一点,而不做下面这些古怪的事情呢?
if (x == 1 || x == 4 || x == 17 || x == ...) {
Edited在这个例子中它是一个(int),我知道对于NSArray和NSString有这个
如果是关于整数值,您可以使用switch
:
switch (x) {
case 1:
case 4:
case 17:
case 29:
case 35:
do_something();
break;
}
不要忘记,在C/c++/Objective-C中,默认情况下,情况会通过下一个。您需要添加break;
语句来防止这种情况。
对于非整数值,你必须做长if
语句,有很多重复,因为C不提供语法糖或许多脚本语言必须缩写的功能。
if ([myArray containsObject:[NSNumber numberWithInteger:x]])
或者更好,使用NSSet
。这将适用于大多数对象,例如,它也适用于字符串。
objective C中有一个快速枚举语法,使用"in"来遍历集合,但是考虑到它需要将int值转换为NSNumbers,在这里使用C可能更容易
BOOL success = NO;
int size = 5
NSInteger numbers[size] = {1,4,17,29,35};
for (int i = 0; i < size; i++) {
if (yourValue == numbers[i]) {
success = YES;
break;
}
}
if (success) {
/* do your stuff */
}
这是我今天的愚蠢程序:
bool int_exists_in_array(const int n, const int a[], const size_t elementCount) {
return (0 != elementCount) &&
(n == a[0] || int_exists_in_array(n, a + 1, elementCount - 1U));
}
:
if x in (1,4,17,29,35):
就变成:
const int a[] = { 1, 4, 17, 29, 35 };
if (int_exists_in_array(x, a, sizeof(a)/sizeof(a[0]))) {
...
}
除了NSValue之外,你还可以使用NSSet。