Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何计算连续的if语句?_Swift_Swift4 - Fatal编程技术网

Swift 如何计算连续的if语句?

Swift 如何计算连续的if语句?,swift,swift4,Swift,Swift4,我有两个if语句要检查,其中一个检查非常昂贵。因此,我想知道以下哪种说法最有效: 1) 我不喜欢“末日金字塔”,但我相信它很好用 for customObject in array { if customObject.isSimpleBool { if customObject.isCostlyBool { // do some stuff } } } 2) 我通常这样写。。。但是如果isSimpleBool是false,

我有两个if语句要检查,其中一个检查非常昂贵。因此,我想知道以下哪种说法最有效:

1) 我不喜欢“末日金字塔”,但我相信它很好用

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是否正在引擎盖下执行循环。也许编译器很聪明,可以合并这两个函数。基准测试可以解决这个问题。引擎盖下的优化会非常好。如果知道这是否与
&&
-解决方案一样有效,那就太好了。您提供的“另一种语法”解决方案就是我将使用的解决方案,谢谢。性能,但更简短,更易懂:)您提供的“另一种语法”解决方案就是我将使用的解决方案,谢谢。性能更高,但更简短,更容易理解:)