Swift 如何计算连续的if语句?
我有两个if语句要检查,其中一个检查非常昂贵。因此,我想知道以下哪种说法最有效: 1) 我不喜欢“末日金字塔”,但我相信它很好用Swift 如何计算连续的if语句?,swift,swift4,Swift,Swift4,我有两个if语句要检查,其中一个检查非常昂贵。因此,我想知道以下哪种说法最有效: 1) 我不喜欢“末日金字塔”,但我相信它很好用 for customObject in array { if customObject.isSimpleBool { if customObject.isCostlyBool { // do some stuff } } } 2) 我通常这样写。。。但是如果isSimpleBool是false,
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
为nil,则永远不会调用obj.property
(否则应用程序将崩溃)
这会起作用的,我已经用过很多次这类语句和nil检查
if (obj != nil && obj!.property == false) {}
如果obj
为nil,则永远不会调用obj.property
(否则应用程序将崩溃)另一种解决方案:
array.filter { $0.isSimpleBool && $0.isCostlyBool }
.forEach { // do some stuff }
顺便说一下:解决方案2和3是同一事物的不同形式。另一种解决方案:
array.filter { $0.isSimpleBool && $0.isCostlyBool }
.forEach { // do some stuff }
顺便说一句:解决方案2和3是同一事物的不同形式。正如前面的注释所述,如果我们有这样的布尔表达式
a && b
如果a为false
,则结果被评估为false,仅评估a
所以
当isSimpleBool
为false
时,评估为false
而不评估isCostlyBool
这就是为什么应该将isSimpleBool
值放在&&
运算符的左侧的原因
另一种语法
最后,这只是另一种写同样逻辑的方式
for elm in array where elm.isSimpleBool && elm.isCostlyBool {
// do some stuff
}
正如已经在评论中指出的,如果我们有这样的布尔表达式
a && b
如果a为false
,则结果被评估为false,仅评估a
所以
当isSimpleBool
为false
时,评估为false
而不评估isCostlyBool
这就是为什么应该将isSimpleBool
值放在&&
运算符的左侧的原因
另一种语法
最后,这只是另一种写同样逻辑的方式
for elm in array where elm.isSimpleBool && elm.isCostlyBool {
// do some stuff
}
看一看。解决方案2将起作用,swift将在知道表达式的答案后立即停止评估。看一看。解决方案2将起作用,swift将在知道表达式的答案后立即停止评估。嗨,瓦迪安,我喜欢这种方法。然而,从性能的角度来看,我们正在执行两个循环(一个用于过滤,一个用于“执行任务”部分)这一事实是一个值得关注的问题。我不确定forEach是否正在引擎盖下执行循环。也许编译器很聪明,可以合并这两个函数。基准测试可以解决这个问题。引擎盖下的优化会非常好。如果知道这是否与
&&
-solution一样有效,那就太好了。嗨,瓦迪安,我喜欢这种方法。然而,从性能的角度来看,我们正在执行两个循环(一个用于过滤,一个用于“执行任务”部分)这一事实是一个值得关注的问题。我不确定forEach是否正在引擎盖下执行循环。也许编译器很聪明,可以合并这两个函数。基准测试可以解决这个问题。引擎盖下的优化会非常好。如果知道这是否与&&
-解决方案一样有效,那就太好了。您提供的“另一种语法”解决方案就是我将使用的解决方案,谢谢。性能,但更简短,更易懂:)您提供的“另一种语法”解决方案就是我将使用的解决方案,谢谢。性能更高,但更简短,更容易理解:)