如何评估连续的 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) 我通常这样写...但是如果 isSimpleBool
是 false
,它会检查 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
当 isSimpleBool
为 false
时 被计算为 false
而不计算 isCostlyBool
。
这是您应该将 isSimpleBool
值放在 &&
运算符的 左侧 一侧的一个很好的理由。
另一种语法
最后只是另一种编写相同逻辑的方式
for elm in array where elm.isSimpleBool && elm.isCostlyBool {
// do some stuff
}
我有两个 if 语句要检查,其中一个检查的成本非常高。所以我想知道以下哪个语句的性能最高:
1) 我不喜欢 "pyramid of doom",但我确定它工作正常
for customObject in array {
if customObject.isSimpleBool {
if customObject.isCostlyBool {
// do some stuff
}
}
}
2) 我通常这样写...但是如果 isSimpleBool
是 false
,它会检查 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
当 isSimpleBool
为 false
时 被计算为 false
而不计算 isCostlyBool
。
这是您应该将 isSimpleBool
值放在 &&
运算符的 左侧 一侧的一个很好的理由。
另一种语法
最后只是另一种编写相同逻辑的方式
for elm in array where elm.isSimpleBool && elm.isCostlyBool {
// do some stuff
}