我要检查两个if语句,其中一个检查成本非常高。因此,我想知道以下哪些陈述是最有效的:
1)我不喜欢厄运的金字塔,但我确信它运作良好
for customObject in array {
if customObject.isSimpleBool {
if customObject.isCostlyBool {
// do some stuff
}
}
}
2)我通常这样写......但如果isCostlyBool
是isSimpleBool
,它会检查false
吗?
for customObject in array {
if customObject.isSimpleBool && customObject.isCostlyBool {
// do some stuff
}
}
3)我知道这有效,但它的评估方式与解决方案2不同吗?
for customObject in array {
if customObject.isSimpleBool, customObject.isCostlyBool {
// do some stuff
}
}
4)还有其他解决方案吗?
答案 0 :(得分:2)
for customObject in array {
if customObject.isSimpleBool && customObject.isCostlyBool {
// do some stuff
}
}
这样可行,我已经多次使用这些语句和nil检查。
if (obj != nil && obj!.property == false) {}
并且在obj
为零的情况下,永远不会调用obj.property
(否则应用程序会崩溃)
答案 1 :(得分:1)
另一种解决方案:
array.filter { $0.isSimpleBool && $0.isCostlyBool }
.forEach { // do some stuff }
顺便说一句:解决方案2和3是同一事物的不同形式。
答案 2 :(得分:1)
正如在评论中已经说过的那样,如果我们有像这样的布尔表达式
a && b
和a为false
,然后将结果评估为false,仅评估a
。
isSimpleBool && isCostlyBool
当false
为isCostlyBool
时,评估为isSimpleBool
而未评估false
。
这是为什么您应该将isSimpleBool
值放在&&
运算符的左侧一侧的充分理由。
最后只是编写相同逻辑的另一种方式
for elm in array where elm.isSimpleBool && elm.isCostlyBool {
// do some stuff
}