更快的if语句:如果`variable`是"value"或"value"

Emi*_*mil 1 c language-agnostic objective-c ios

如何在一个参数中与多种可能性进行比较?

例:

if ((integer == 2) || (integer == 5))

if ((string == "hello") || (string == "dolly))
Run Code Online (Sandbox Code Playgroud)

如果您可以像这样编写代码,可以节省很多代码:

if (integer == (2 || 5))

if (string == ("hello" || "dolly"))
Run Code Online (Sandbox Code Playgroud)

Jen*_*edt 11

首先,字符串比较在C中不起作用,我对Objective-c一无所知.

为了与编译时积分常量进行比较,在C中你有switch语句:

switch (integer) {
case 2: ;
case 5: ;
   /* do stuff here */
}
Run Code Online (Sandbox Code Playgroud)


kov*_*pas 7

实际上,您可以检查NSSet是否包含某个对象.这不适用于int,因为它不是一个对象,但可以使用NSString.

我相信它可以写成这样:

if ( [[NSSet setWithObjects:@"hello", @"dolly", nil] containsObject:string] )
Run Code Online (Sandbox Code Playgroud)

所以,如果你想比较整数,你应该用NSNumber包装它们.

如果你不比较数十个对象,这将不会保存很多代码,但这看起来非常类似于你想得到的:)

更新:

或者另一种方式(非常类似于John Calsbeek答案,但适用于多个参数):

@implementation NSObject (IsEqualMultiple)

- (BOOL)isEqualToOneOfObjects:(id)firstObject, ... {
    id eachObject;
    va_list argumentList;

    if (firstObject) {
        if ( [self isEqual:firstObject] ) return YES;

        va_start(argumentList, firstObject);

        while (eachObject = va_arg(argumentList, id))
            if ( [self isEqual:eachObject] ) return YES;
        va_end(argumentList);
    }

    return NO;
}

@end
Run Code Online (Sandbox Code Playgroud)

用法:

if ( [string isEqualToOneOfObjects:@"hello", @"dolly", @"this", @"is", @"Louis", nil] )
Run Code Online (Sandbox Code Playgroud)