如何(更多)有效地写出使用相同变量和大量OR运算符的 if / else 条件?
我一直在敲桌子试图想出一种方法,用相同的比较来写出所有这些OR运算符。 对于循环不会起作用,我很确定 do / while 循环也不会这样做。 开关/案例可能会解决这个问题,但我认为它不会压缩代码或使其写出来更加乏味。
下面的例子说明了我的困境。 uicollectionview API具有一个协议方法,该方法为集合中的每个部分调用,并且需要该部分中项目数的返回值。从本质上讲,下面的协议方法是一个花哨的 for 循环。
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
if (section == 0 || section == 31) return 7;
else if (section == 1 || section == 26 || section == 27 || section == 28 || section == 29 || section == 30) return 6;
else if (section == 2 || section == 3 || section == 4 || section == 5 || section == 6 || section == 7 || section == 8 || section == 9 || section == 10 || section == 11 || section == 12 || section == 13 || section == 14 || section == 15) return 2;
else if (section == 16 || section == 17 || section == 18 || section == 19 || section == 20 || section == 21 || section == 22 || section == 23 || section == 24 || section == 25) return 4;
else return 7;
}
正如您在我编写的非常繁琐的 if / else 条件中所看到的那样,它会检查每个部分。我觉得我错过了一些东西 - Objective-C为这种繁琐而低效的条件写作/检查提供了一种很好的方法吗?
答案 0 :(得分:3)
一种干净的方法是使用switch
语句。这些通常使用分支数组实现,因此非常有效。
switch (section)
{
case 0:
case 31:
return 7;
...
}
最有效的(无分支)是查找表:
const int nums[]= { 7, 6, 2, 2, 2... };
return nums[section];
答案 1 :(得分:1)
switch
可能是正确的答案,但您也可以使用shift / mask,例如:
int sectionBit = 0x00000001 << section;
if (sectionBit & 0x80000001) return 7;
if (sectionBit & 0x7c000002) return 6;
etc
这种方法的缺点是定义位常量很繁琐且容易出错,但有时可以通过使用枚举等来开发常量(以长声明字符串为代价)。
答案 2 :(得分:1)
通用的方法是使用NSArray
/ NSDictionary
来构建索引,例如:
NSArray *sections = @[@3, @5, @27, ...];
if ([sections containsObject:@3]) ...
或
NSDictionary *sections = @{ @5: @27, @7: @23, ... };
int value = [sections[@(section)] intValue]