如何评估连续的 if 语句?

How are consecutive if statements evaluated?

我有两个 if 语句要检查,其中一个检查的成本非常高。所以我想知道以下哪个语句的性能最高:

1) 我不喜欢 "pyramid of doom",但我确定它工作正常

for customObject in array {
    if customObject.isSimpleBool {
        if customObject.isCostlyBool {
            // do some stuff
        }
    }
}

2) 我通常这样写...但是如果 isSimpleBoolfalse,它会检查 isCostlyBool 吗?

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) 是否还有其他我没有找到的解决方案?

for customObject in array {
    if customObject.isSimpleBool && customObject.isCostlyBool {
        // do some stuff
    }
}

这行得通,我已经多次使用这种带有 nil 检查的语句。

if (obj != nil && obj!.property == false) {}

并且在 obj 为零的情况下,永远不会调用 obj.property(否则应用程序会崩溃)

另一个解决方案:

array.filter { [=10=].isSimpleBool && [=10=].isCostlyBool }
     .forEach { // do some stuff } 

顺便说一句:解决方案2和3是同一件事的不同形式。

如评论中所述,如果我们有这样的布尔表达式

a && b

and a is false then the result is evaluated as false only evaluating a.

所以...

isSimpleBool && isCostlyBool
isSimpleBoolfalse

被计算为 false 而不计算 isCostlyBool

这是您应该将 isSimpleBool 值放在 && 运算符的 左侧 一侧的一个很好的理由。

另一种语法

最后只是另一种编写相同逻辑的方式

for elm in array where elm.isSimpleBool && elm.isCostlyBool {
    // do some stuff
}