这个if / else语句占据了我班级的很大一部分,坦白说它很烦人。有什么办法可以让这个更小更少的代码吗?这只是我实际代码的一个示例,但是如果有人可以帮我减小尺寸,我可以将它应用到我的实际代码中。
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
if ([self.currentSearchStr length] == 0) {
phoneViewController = [[viewController alloc] initWithNibName:@"viewController"
bundle:nil
list:self.list
index:indexPath.row
title:self.title];
} else {
phoneViewController = [[viewController1 alloc] initWithNibName:@"viewController1"
bundle:nil
list:self.list1
index:indexPath.row
title:self.title];
}
} else {
if ([self.currentSearchStr length] == 0) {
padViewController = [viewController alloc] initWithNibName:@"viewController"
bundle:nil
list:self.list
index:appDelegate.mSelectedRow
title:self.title];
} else {
padViewController = [[viewController1 alloc] initWithNibName:@"viewController1"
bundle:nil
list:self.list1
index:appDelegate.mSelectedRow
title:self.title];
}
答案 0 :(得分:6)
也许你可以像这样重构?使用? :
BOOL searchEmpty = [self.currentSearchStr length] == 0;
BOOL isIPhone = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone;
Class ViewControllerCls = searchEmpty ? [ViewController class] : [ViewController1 class];
NSString* nibName = searchEmpty ? @"viewController" : @"viewController1";
NSArray* list = searchEmpty ? self.list : self.list1;
NSInteger index = isIPhone ? indexPath.row : appDelegate.mSelectedRow;
viewController = [[ViewControllerCls alloc] initWithNibName:nibName
bundle:nil
list:list
index:index
title:self.title];
答案 1 :(得分:2)
编辑:我更喜欢童年安迪的回答,因为它是我自己的一个更清洁的版本,但我会把这个留下来,这样你就可以理解if-else逻辑Andy的?:
陈述背后。
是的,您可以通过在将initWithNibName:
参数插入单initWithNibName:
语句之前根据条件设置NSString *nibName;
NSArray *list;
if ([self.currentSearchStr length] == 0) {
nibName = @"viewController";
list = self.list;
} else {
nibName = @"viewController1";
list = self.list1;
}
int index;
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
index = indexPath.row;
} else {
index = appDelegate.mSelectedRow;
}
padViewController = [[viewController1 alloc] initWithNibName:nibName
bundle:nil
list:list
index:index
title:self.title];
参数来压缩逻辑。
{{1}}
答案 2 :(得分:0)
这个特殊情况可以重构为initWithNibName的一次调用,参数作为变量(如其他答案所示)。
但是,如果这种类型的代码全部结束,请考虑将文件分成两个子类,一个用于iPad,另一个用于iPhone。公共代码可以存在于基类中。像这样打破这个课程并不总是正确的事情,但是值得考虑(理想情况是在单个文件太大之前!)。