消除foreach循环中的switch语句

时间:2011-01-14 21:07:37

标签: iphone objective-c anti-patterns

我对在一个UIView中使用'.tags'查找子视图有疑问。

for (UIView *viewObj in [self.view subviews])
{
   // want to find viewObject by its tag.
   // but I heard for-switch or for-case paradigm are bad pattern design by WTF.
   // there are total 9 of tags will be use for finding view object
   switch (viewObj.tag)
   {
         case 0:
         .
         ..
         ...
   }
}

如何使其成为非切换或非if语句?我应该只添加到一个数组然后从那里获取?例如,您使用所需的标记添加视图并从此数组中获取。

谢谢。

5 个答案:

答案 0 :(得分:3)

从你的评论中,它是一组非常有限的项目 - 9项。如果预计这是静态的,那么switch语句就没有什么问题。也许您可以在功能上将每个开关分解为单独的方法。也就是说,除了阵列的想法之外,命令模式可能是一种需要考虑的方法。供参考:http://en.wikipedia.org/wiki/Command_pattern

答案 1 :(得分:2)

如果它只是固定数量的视图,并且每个视图都有不同的方法需要执行,您可以直接访问视图。

UIView* someView = [self.view viewWithTag:0];
//Operations on view 0


UIView* someOtherView = [self.view viewWithTag:1];
//Operations on view 1

//...

答案 2 :(得分:1)

您可以做的一件事是让UIView中的subviews具有相同类型的id<YourProtocol>,使每个符合相同的协议。然后,您可以将每个投放到UIView并在每个{{1}}内调用相同的方法。

答案 3 :(得分:0)

为了进一步回答Shan的问题,如果你可以将它们分解为函数并将它们(函数指针)放入数组中,那么你可以使它更简单,或者你可以使用新的"Blocks"语言特色。

答案 4 :(得分:0)

有一个新的IBOutlet类型,IBOutletCollection。你将它用于NSArray,然后在IB中你可以向该出口添加视图 - 在运行时,它们都将被放入数组(无序)。

要获得你想要的特定的一个,你可以在viewDidLoad中将所有NSArray条目映射到一个由标签值键入的字典,然后只需使用“objectForKey”将它们取出。