更快的if语句:如果`variable`是“value”或“value”
你怎么能在一个论点中与多种可能性进行比较?
例:
if ((integer == 2) || (integer == 5)) if ((string == "hello") || (string == "dolly))
如果你能写这样的话,会节省很多代码:
if (integer == (2 || 5)) if (string == ("hello" || "dolly"))
首先,string比较在C中并不是那种方式,对于objective-c,我一无所知。
为了与编译时积分常量进行比较,在C语言中有switch语句:
switch (integer) { case 2: ; case 5: ; /* do stuff here */ }
其实,你可以检查NSSet是否包含一些对象。 这不会与int,因为它不是一个对象,但将与NSString的工作。
我相信可以这样写:
if ( [[NSSet setWithObjects:@"hello", @"dolly", nil] containsObject:string] )
所以,如果你想比较整数,你应该用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
用法:
if ( [string isEqualToOneOfObjects:@"hello", @"dolly", @"this", @"is", @"Louis", nil] )
如果你想用对象types(比如说NSString
来做到这一点,并且你对类别感到满意,你可以添加一个类别方法:
@implementation NSObject (IsEqualMultiple) - (BOOL)isEqualTo:(id)obj1 or:(id)obj2 { return [self isEqual:obj1] || [self isEqual:obj2]; } @end
那么你可以像这样使用它:
if ([string isEqualTo:@"hello" or:@"dolly"])
这不是语言的一部分。 如果你真的想要避免input,你可以创build一个函数来完成这个function,如下所示:
int intIsIn (int needle, int *haystack, size_t sz); : if (intIsIn (integer, {2,5}, 2)) ...
(和其他数据types相似)。 我质疑这种方法的有用性,但是因为(1)对于较长的列表来说,只是less打字; 和(2)你可能最终在“每日跆拳道” 🙂
我的意见是只是吸了起来,这不是那么多的打字。
创build一个可变参数函数或一个接收比较string数组的函数 。
如果您的整数非零且小到足以容纳unsigned char
或wchar_t
,那么执行此操作的便捷方法如下所示:
if (strchr("\2\5", integer)) ...
要么:
if (wcschr(L"\2\5", integer)) ...
请记住这些是八进制值,而不是十进制。 如果您愿意,可以使用hex( \x
)。
对于string,使其高效的方法是使用正则expression式,或者编写自己的DFA来接受要testing的string集。
首先,你应该记住,好的编译器应该优化多重比较,如果它能够得出关于它们的结论,例如,如果通过文字集来比较值。 所以不需要像x == 1 ||那样对expression式进行优化 x == 3 || 手动x == 7。
在C中,可以在0..31范围内使用整数(或者你可以用long来代替long)
if(((1UL<<val1)|(1UL<<val2)|(1UL<<val3)) & (1UL<<x)) ...
这创build了具有与值对应的位的数字应当评估为真。 如果您需要与小整数的variables列表进行比较,则很方便。
您也可以使用sorting的数组值和c标准函数bsearch():
int valuelist[] = { /* note it sorted */ 2, 5, 17, 33, 99, 103, 808 } int valuelist_length = sizeof(valuelist)/sizeof(int); /* this works only for statically allocated non-external arrays, */ /* you may need another method of evaluating number of items */ int compar_int(const void *a, const void *b) { return ((const int *)b < (const int *)a) - ((const int *)a < (const int *)b); } ... if(bsearch(&x, valuelist, sizeof(int), valuelist_length, compar_int)) { /* bsearch returns pointer to found value or NULL if it is not found */ /* so it will be evaluated as true if value exists in array */ }
但是,只有当你有很多数字比较时,这才是有效的。