【发布时间】:2014-08-11 20:20:58
【问题描述】:
我如何(更)有效地写出使用相同变量和大量 OR 运算符的 if / else 条件?
我一直在努力想办法用相同的比较写出所有这些 OR 运算符。 For 循环不会成功,我很确定 do / while 循环也不会这样做。 switch / case 可能会解决这个问题,但我认为它不会压缩代码或减少写出的乏味。
下面的例子说明了我的困境。 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 提供了一种很好的方法来解决这种乏味且低效的条件编写/检查?
【问题讨论】:
-
您可以为这些映射使用字典。
-
或者更好的是,不要使用静态值。有一个代表每个部分的数组。然后只需询问适当的数组它有多大。您共享的代码似乎是在尝试使用视图模型。不要抗拒,视图模型很棒。
-
是的,拥有合适的数据结构可以解决这个问题。也就是说,您的几个条件表达式相当于检查一个值是否在整数范围内。您可以将它们折叠成
2 <= section && section <= 15和16 <= section && section <= 25等。 -
...或者只使用 NSIndexSex。这就是它的用途。
-
使用
<=和>=@KenThomases 是对的,但这个问题也可以更广泛地应用(例如,字符串、字典等)。
标签: uicollectionview objective-c c cocoa-touch optimization conditional-statements