0

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

1)我不喜欢“末日金字塔”,但我确信它可以正常工作

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

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

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

4

3 回答 3

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

这会起作用,我已经多次使用这些带有 nil 检查的语句。

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

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

于 2017-06-23T17:36:42.070 回答
1

另一种解决方案:

array.filter { $0.isSimpleBool && $0.isCostlyBool }
     .forEach { // do some stuff } 

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

于 2017-06-23T17:43:21.480 回答
1

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

a && b

然后 afalse将结果评估为 false only 评估a

所以...

isSimpleBool && isCostlyBool

被评估为false不评估isCostlyBoolwhen isSimpleBoolis false

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

另一种语法

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

for elm in array where elm.isSimpleBool && elm.isCostlyBool {
    // do some stuff
}
于 2017-06-23T17:58:40.983 回答