Uicollectionview 使用大量OR运算符编写条件语句的更有效方法

Uicollectionview 使用大量OR运算符编写条件语句的更有效方法,uicollectionview,objective-c,c,cocoa-touch,optimization,conditional-statements,Uicollectionview,Objective C,C,Cocoa Touch,Optimization,Conditional Statements,如何(更有效地)写出使用相同变量和大量OR运算符的if/else条件 我一直在办公桌上磕磕碰碰,想办法写出所有这些或运算符,并进行相同的比较。For循环不会起作用,我很确定do/while循环也不会起作用。一个开关/案例可能会解决这个问题,但我不认为它可以压缩代码,或者让它写出来的枯燥程度降低 下面的例子说明了我的困境。API有一个协议方法,该方法为集合中的每个部分调用,并且需要该部分中项目数的返回值。从本质上讲,下面的协议方法是一种奇特的for循环 正如您在我编写的极其乏味的if/else条件

如何(更有效地)写出使用相同变量和大量OR运算符的if/else条件

我一直在办公桌上磕磕碰碰,想办法写出所有这些或运算符,并进行相同的比较。For循环不会起作用,我很确定do/while循环也不会起作用。一个开关/案例可能会解决这个问题,但我不认为它可以压缩代码,或者让它写出来的枯燥程度降低

下面的例子说明了我的困境。API有一个协议方法,该方法为集合中的每个部分调用,并且需要该部分中项目数的返回值。从本质上讲,下面的协议方法是一种奇特的for循环


正如您在我编写的极其乏味的if/else条件中所看到的,它检查每个部分。我觉得我遗漏了一些东西——Objective-C提供了一种巧妙的方法来解决这种单调而低效的条件写入/检查?

一种干净的方法是使用
开关
语句。它们通常通过分支数组实现,因此非常有效

switch (section)
{
case 0:
case 31:
    return 7;
...
}
其中最有效的(无分支)是查找表:

const int nums[]= { 7, 6, 2, 2, 2... };

return nums[section];

一个干净的方法是使用
开关
语句。它们通常通过分支数组实现,因此非常有效

switch (section)
{
case 0:
case 31:
    return 7;
...
}
其中最有效的(无分支)是查找表:

const int nums[]= { 7, 6, 2, 2, 2... };

return nums[section];

开关
可能是正确的答案,但您也可以使用shift/mask,例如:

int sectionBit = 0x00000001 << section;
if (sectionBit & 0x80000001) return 7;
if (sectionBit & 0x7c000002) return 6;
etc
NSArray *sections = @[@3, @5, @27, ...];
if ([sections containsObject:@3]) ...

int sectionBit=0x00000001
开关可能是正确答案,但您也可以使用shift/mask,例如:

int sectionBit = 0x00000001 << section;
if (sectionBit & 0x80000001) return 7;
if (sectionBit & 0x7c000002) return 6;
etc
NSArray *sections = @[@3, @5, @27, ...];
if ([sections containsObject:@3]) ...

int sectionBit=0x00000001一种通用的方法是使用
NSArray
/
NSDictionary
构建索引,类似于:

int sectionBit = 0x00000001 << section;
if (sectionBit & 0x80000001) return 7;
if (sectionBit & 0x7c000002) return 6;
etc
NSArray *sections = @[@3, @5, @27, ...];
if ([sections containsObject:@3]) ...


一种通用方法是使用
NSArray
/
NSDictionary
构建索引,类似于:

int sectionBit = 0x00000001 << section;
if (sectionBit & 0x80000001) return 7;
if (sectionBit & 0x7c000002) return 6;
etc
NSArray *sections = @[@3, @5, @27, ...];
if ([sections containsObject:@3]) ...


对于这些映射,您可以使用字典。或者更好的是,不要使用静态值。有一个表示每个部分的数组。然后只需询问相应的数组它有多大。您共享的代码似乎是在尝试使用视图模型。不要反对,视图模型太棒了。是的,有一个合适的数据结构可以解决这个问题。也就是说,一些条件表达式相当于检查值是否在整数范围内。您可以将它们折叠到
2…或者只使用nsindexex。这就是它的用途。您使用
=
@kenthomase是正确的,但是这个问题也可以更普遍地应用(例如,使用字符串、字典等)。您可以使用字典进行这些映射。或者更好的是,不要使用静态值。有一个表示每个部分的数组。然后只需询问相应的数组它有多大。您共享的代码似乎是在尝试使用视图模型。不要反对,视图模型太棒了。是的,有一个合适的数据结构可以解决这个问题。也就是说,一些条件表达式相当于检查值是否在整数范围内。您可以将它们折叠到
2…或者只使用nsindexex。这就是它的用途。您使用
=
@kenthomase是正确的,但这个问题也可以更普遍地应用(例如,使用字符串、字典等)。我建议使用switch。更清晰、更清晰、更易于评论,以描述您正在做的事情。使用位掩码和范围折叠可以隐藏意图并引入意外错误。我建议使用switch。更清晰、更清晰、更易于评论,以描述您正在做的事情。使用位掩码和范围折叠可以隐藏意图并引入意外错误。