Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 2-使用中断if语句的用例?_Swift_If Statement_Break_Swift2 - Fatal编程技术网

Swift 2-使用中断if语句的用例?

Swift 2-使用中断if语句的用例?,swift,if-statement,break,swift2,Swift,If Statement,Break,Swift2,Swift 2的指南提到可以结束if语句的程序执行。我个人从未使用过“与if决裂”语句 break语句结束循环的程序执行,if语句, 或switch语句…当break语句后跟 语句标签的名称,它结束循环的程序执行,如果 语句或由该标签命名的开关语句 在什么情况下可以在if语句中使用break?这个语言功能似乎没用 TEST: if (true) { break TEST } 在if语句中使用break似乎有点做作,我想不出哪种风格需要它。但是,当跳过if-else子句中if语句的后一部

Swift 2的指南提到可以结束if语句的程序执行。我个人从未使用过“与if决裂”语句

break语句结束循环的程序执行,if语句, 或switch语句…当break语句后跟 语句标签的名称,它结束循环的程序执行,如果 语句或由该标签命名的开关语句

在什么情况下可以在if语句中使用break?这个语言功能似乎没用

TEST:
if (true) {
    break TEST
}

在if语句中使用break似乎有点做作,我想不出哪种风格需要它。但是,当跳过if-else子句中if语句的后一部分时,它确实节省了额外的缩进级别,这对于深度嵌套的循环非常有用

在其他语言中,一种流行(和/或有争议)的习惯用法是使用标签来处理深度嵌套函数中的错误。例如,可能希望在出错时中断循环,如下所示:

func testBreak3() {
    // doesn't compile!!!
    let a = false, b = true, x = 10, y = 20, err = true
    if !a {
        if b && x > 0 {
            if y < 100 {
                if err {
                    break handleError
                }
                // some statements
            } else {
                // other stuff
            }

        }
    }
    return  // avoid error handling

    handleError:
    print("error")
    // handle the error
}
if condition1 {
    // code
    if condition2 {
        // code
        if condition3 {
            // code
            if condition4 {
                //code
            }
        }
    }
}

例如,如果您想用一组数字(偶数/有理数/负数)来描述一个数字(带字符串),那么您的代码可以如下所示:

func testBreak3() {
    // doesn't compile!!!
    let a = false, b = true, x = 10, y = 20, err = true
    if !a {
        if b && x > 0 {
            if y < 100 {
                if err {
                    break handleError
                }
                // some statements
            } else {
                // other stuff
            }

        }
    }
    return  // avoid error handling

    handleError:
    print("error")
    // handle the error
}
if condition1 {
    // code
    if condition2 {
        // code
        if condition3 {
            // code
            if condition4 {
                //code
            }
        }
    }
}
您可以通过重构(使用
guard
)实现相同的逻辑,但不需要嵌套的ifs:

您可能认为这也可以通过
开关
故障排除
实现,但这不适用于“正常”情况,因为它会检查所有条件,如果满足一个条件,则甚至不会评估以下所有条件

因此,必须有条件地调用
FallThrough

这确实管用,但我的可读性不强,更不用说它的“美”:


我知道这是一个老话题,但刚才我用了休息,这是必要的。 所以我举个例子 我有一个对象数组。 当用户点击单元格时,该单元格中的对象的i.parameter变为True。 我需要知道数组中的所有对象何时具有I.parameter=True,这是停止游戏的条件

func forTimer(){
   for i in array {
    if i.parameter == false {
     break
  }
 }
}
timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(forTimer), userInfo: nil, repeats: true)
即使一个i.parameter=false,我也不需要检查数组的其余部分。
这个函数每毫秒调用一次,所以我不必每毫秒检查整个数组

我能想到的唯一一种情况是在循环中的if语句中使用break。。。但在所有其他语言中都是这样,在这种情况下,它仍然是一个循环,而不是if语句。我看不出破译if语句的能力的价值。@Boon我也想不出一个。每一个可能的用法我都可以更优雅地重写。很好的例子——投票结果是向上的,尽管这个破发是针对守卫的,而不是如果。你能想到一种情况,在这种情况下,你会想要中断if语句吗?在我的游戏中,中断退出了
if
语句的范围。您可以解决所有问题,而无需中断
if
语句,但它的可读性要好得多。此外,从可读性方面来说,突破
do
甚至更好(上面添加了示例)。今天我学到了一个新东西,关于“守卫”和仅从指定范围内逃逸。酷!我很好奇为什么重构在这里更具吸引力,以及如何重构。对于我来说,这个解决方案似乎是在SDK版本检查的基础上打破对某个不推荐的启动选项的检查的最干净的方法。你觉得这是一种风格需要这种解决方案的情况吗?@eLillie上面的解决方案似乎非常适合你的情况,我所知甚少。从各方面考虑,嵌套级别较低的代码更易于阅读。重构可能是减少嵌套的东西,例如执行所有检查的函数。当然,还要考虑所有其他问题,如函数的参数数量等。OP要求在if语句上使用
break
s,而不是for循环。在if嵌套循环中使用“break”,而不是在for循环中使用。我没有戴牙套,因为我认为这是可以理解的。我已经编辑并添加了大括号。您的break语句将外部的for语句断开,而不是内部的if语句。OP问关于中断if语句的问题。OP问“在什么情况下会在if语句中使用中断?”我已经回答了这个问题。请阅读问题。我不认为我一年前的答案应该是否定的。
func forTimer(){
   for i in array {
    if i.parameter == false {
     break
  }
 }
}
timer = Timer.scheduledTimer(timeInterval: 0.001, target: self, selector: #selector(forTimer), userInfo: nil, repeats: true)