我有两个深刻的if语句,我想知道我是否可以压缩到单个if stmt:
if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]])
{
if (((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i)
{
//code
}
}
我不确定我是否可以进入:
if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]] && ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i)
因为第二个if条件依赖于第一个(如果它不是UILabel并且没有.tag值)会发生不好的事情吗?
答案 0 :(得分:6)
您可以将它们组合起来,是的。如果第一个语句失败,那么它将失败整个if
语句,并且不执行第二部分。
为了便于阅读,我可能会这样写:
if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]] &&
((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i)
{
// code
}
答案 1 :(得分:4)
没关系。 C(以及扩展,Objective-C)&&表达式是“短路的”。如果第一个子句的计算结果为false,则不评估第二个子句。
答案 2 :(得分:3)
&&
运算符在到达false子句时停止计算。只要评估没有引起任何副作用,就不应该有任何问题。
然而,换行和空格是您易读的朋友:
if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]]
&& ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i)
{
//code
}
答案 3 :(得分:2)
众所周知,这是可能的,但可读性是主要问题。虽然在建议中使用空格是好的
if ([[myScrollView.subviews objectAtIndex:k] isKindOfClass:[UILabel class]]
&& ((UILabel *)[myScrollView.subviews objectAtIndex:k]).tag >= i)
{
//code
}
我个人仍然觉得我必须做一个双重理解才能理解这些陈述是做什么的,所以有时可能值得进一步考虑可读性
UILabel *label = [myScrollView.subviews objectAtIndex:k]
BOOL isLabel = [label isKindOfClass:[UILabel class]];
BOOL hasSuitableTag = label.tag >= i;
if (isLabel && hasSuitableTag) {
//code
}
或保持短路(谢谢@CocoaFu)
UILabel *label = [myScrollView.subviews objectAtIndex:k]
BOOL isLabel = [label isKindOfClass:[UILabel class]];
if (isLabel && label.tag >= i) {
//code
}
结果读起来更像英语(如果你在你的内容中扩展它)is a label and has a suitable tag
。它可能会稍微长一些,但是当您在几周内阅读它时,您会欣赏添加的打字。
必须编写程序供人们阅读,并且只有机器才能执行。
Abelson&苏斯曼,Structure and Interpretation of Computer Programs
答案 4 :(得分:1)
你可以采取第二种方式。基本上,在AND语句中,编译器将检查第一个语句,如果它为false,则不会检查第二个语句...所以第二个/内部语句只在第一个语句为真时才被计算。