在objective-c中,值"in"一些其他值



来自一个极度被宠坏的家庭(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。

最新更新