如何评估连续的if语句?

时间:2017-06-23 14:11:41

标签: swift swift4

我要检查两个if语句,其中一个检查成本非常高。因此,我想知道以下哪些陈述是最有效的:

1)我不喜欢厄运的金字塔,但我确信它运作良好

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

2)我通常这样写......但如果isCostlyBoolisSimpleBool,它会检查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)还有其他解决方案吗?

3 个答案:

答案 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
falseisCostlyBool时,

评估为isSimpleBool而未评估false

这是为什么您应该将isSimpleBool值放在&&运算符的左侧一侧的充分理由。

另一种语法

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

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