4.5 Swift语言中的流程跳转语句

跳转语句可以提前中断循环结构,也可以人为控制选择结构的跳转,使代码的执行更加灵活多变。Swift中提供了大量的流程跳转语句供开发者使用,熟悉这些语句的结构与特点可以使开发效率大大提高。Swift中提供的流程跳转语句主要有continue、break、fallthrough、return、throw、guard。

continue语句用于循环结构中,其作用是跳过本次循环,直接开始下次循环。这里需要注意,continue的作用并不是跳出循环结构,而是跳过本次循环,直接执行下一个循环周期。示例如下:

上面的示例代码将跳过index等于6时的代码块,在打印信息中会缺少index等于6时的打印输出。需要注意的是,continue语句默认的操作范围是直接包含它的这一层循环结构,如果代码中嵌套了多层循环结构,continue语句会跳过本次循环。那么,如果想要实现不跳过本次循环,而是直接跳至开发者指定的那一层循环结构,该如何写呢?示例如下:

以上代码创建了两层循环结构,在内层循环中使用continue语句进行跳转,MyLabel是外层循环的标签,因此这里的continue跳转将会跳出indexI等于1时的外层循环,直接开始indexI等于2的循环操作。

break语句是中断语句,也可以用于循环结构中。和continue语句不同的是,break语句会直接中断直接包含它的循环结构,即当循环结构为一层时,如果循环并没有执行完成,则后面所有的循环都将被跳过。如果有多层循环结构,程序会直接中断直接包含它的循环结构,继续执行该循环结构外层的循环结构,示例如下:

上面的代码在index等于6时使用了break语句进行中断,第5次循环后的所有打印信息都将被跳过。break语句默认将中断直接包含它的循环结构,同样也可以使用指定标签的方式来中断指定的循环结构,示例如下:

break语句也可以用于switch结构中。在switch结构中,break语句将直接中断后面所有的匹配过程,直接跳出switch结构。在Swift语言中,switch-case选择匹配结构默认就是break操作,故开发者不必手动添加break代码。

fallthrough语句是Swift中特有的一种流程控制语句。前面提到过,当Swift语言中的switch-case结构匹配到一个case后会自动中断后面所有case的匹配操作。如果在实际开发中需要switch-case结构不自动进行中断操作,可以使用fallthrough语句,示例如下:

如上示例代码将会打印Sure、Sim和SIM。

return语句对于读者来说应该十分熟悉,其在函数中用于返回结果值,也可以用于提前结束无返回值类型的函数。当然,return语句的应用场景也不只局限于函数中,在闭包中也可以使用return进行返回。关于函数的相关知识,会在后面的章节做详细的介绍,这里只做简单演示,示例如下:

throw语句用于异常抛出,throw语句抛出的异常如果不进行捕获处理,也会使程序中断。Swift语言中有抛出异常和处理异常的代码结构,在后面章节中会详细介绍,这里也只做简单演示。在函数中抛出异常的代码示例如下:

guard-else结构语句是Swift 2.0之后新加入的一种语法结构,Swift团队创造它的目的在于使代码的结构和逻辑更加清晰。在实际开发中,尤其是在函数的编写中,经常会遇到这样的场景:就是当参数符合某个条件时,函数才能正常执行,否则直接通过return来终止函数的执行,如果不使用guard-else结构,示例代码如下:

上面的代码结构在逻辑上并不那么优美,开发者的原意是当param参数大于0时才执行函数中的操作,在2.0之前却使用了相反的逻辑来中断函数,当然,开发者也可以将函数实现为如下形式:

经过修改后,代码逻辑清晰了许多,然而还是有一些问题。如果这个函数中需要做的操作很多,那么所有条件判断的代码都将写在if语句块中,代码结构就会显得杂乱无章。guard-else语句就是为了优化这种情况而产生的。guard-else语句也被称为守护语句,顾名思义,其作用就是确保某个条件成立才允许其后的代码执行。示例如下: