![Swift 5从零到精通iOS开发训练营](https://wfqqreader-1252317822.image.myqcloud.com/cover/144/44510144/b_44510144.jpg)
4.5 Swift语言中的流程跳转语句
跳转语句可以提前中断循环结构,也可以人为控制选择结构的跳转,使代码的执行更加灵活多变。Swift中提供了大量的流程跳转语句供开发者使用,熟悉这些语句的结构与特点可以使开发效率大大提高。Swift中提供的流程跳转语句主要有continue、break、fallthrough、return、throw、guard。
continue语句用于循环结构中,其作用是跳过本次循环,直接开始下次循环。这里需要注意,continue的作用并不是跳出循环结构,而是跳过本次循环,直接执行下一个循环周期,示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P71_16634.jpg?sign=1739318578-EkColffeZrrsUbEzMtHh80UZkFZ9QD90-0-99813b3a84f8ad569e5fc9e40f344745)
上面的示例代码将跳过index等于6时的代码块,在打印信息中会缺少index等于6时的打印输出。需要注意的是,continue语句默认的操作范围直接包含它的这一层循环结构,如果代码中嵌套了多层循环结构,continue语句会跳过本次循环。那么,如果想要实现不跳过本次循环,而是直接跳至开发者指定的那一层循环结构,该如何写呢?示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P71_16636.jpg?sign=1739318578-SrqoQech4ufe95wEyYUurLA9VBDspBYn-0-f02f84b1a949f8d3308d0dc033c0f6e3)
以上代码创建了两层循环结构,在内层循环中使用了continue语句进行跳转,MyLabel是外层循环的标签,因此这里的continue跳转将会跳出indexI等于1时的外层循环,直接开始indexI等于2的循环操作。
break语句是中断语句,其也可以用于循环结构中,和continue语句不同的是,break语句会直接中断直接包含它的循环结构,即当循环结构为一层时,如果循环并没有执行完成,则后面所有的循环都将被跳过。如果有多层循环结构,程序会直接中断直接包含它的循环结构,继续执行该循环结构外层的循环结构,示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P72_16638.jpg?sign=1739318578-xCjqeB2RMGlAoBiiJ7kD0zaZSB6WgEPE-0-5e3cd0d5b8f78d89cb459a50f0962883)
上面的代码在index等于6时使用了break语句进行中断,第5次循环后的所有打印信息都将被跳过。break语句默认将中断直接包含它的循环结构,同样也可以使用指定标签的方式来中断指定的循环结构,示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P72_16640.jpg?sign=1739318578-wBmu5FnevM1LCAFUxc0yrI5AKfRJK0fb-0-8202a66702e285b05f68e255436e9226)
break语句也可以用于switch结构中。在switch结构中,break语句将直接中断后面所有的匹配过程,直接跳出switch结构。在Swift语言中,switch-case选择匹配结构默认就是break操作,故开发者不必手动添加break代码。
fallthrough语句是Swift中特有的一种流程控制语句,前面提到过,当Swift语言中的switch-case结构匹配到一个case后,会自动中断后面所有case的匹配操作,如果在实际开发中需要switch-case结构不自动进行中断操作,可以使用fallthrough语句,示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P72_16642.jpg?sign=1739318578-5Uk2MvFmcE0yUxhDyeGxTngTsfb7uE0g-0-61db1415e9e651c476a50f445c599db2)
以上示例代码将会打印Sure、Sim和SIM。
return语句对于读者来说应该十分熟悉,其在函数中用于返回结果值,也可以用于提前结束无返回值类型的函数。当然,return语句的应用场景不只局限于函数中,在闭包中也可以使用return进行返回。函数的相关知识会在后面的章节详细介绍,这里只做简单演示,示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P73_16643.jpg?sign=1739318578-H5eg9pK77xuqIhDMBAgmdX09NCJSBjxa-0-769ccebe12fac969c36e3e7be8a229fd)
throw语句用于异常的抛出,throw语句抛出的异常如果不进行捕获处理,也会使程序中断。Swift语言中有抛出异常和处理异常的代码结构,在后面的章节中会详细介绍,这里只做简单演示。在函数中抛出异常的示例代码如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P73_16644.jpg?sign=1739318578-DBKCcBEn6thY8qGnaU3wwaI8NrYV4VZd-0-58655a747a84b761a86c15409a4eea4f)
guard-else结构语句是Swift 2.0之后新加入的一种语法结构,Swift团队创造它的目的在于使代码的结构和逻辑更加清晰。在实际开发中,尤其是在函数的编写中,经常会遇到这样的场景:当参数符合某个条件时,函数才能正常执行,否则直接通过return来终止函数的执行,如果不使用guard-else结构,示例代码如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P73_16646.jpg?sign=1739318578-9LREW1bl2IrE0x1iPe4z21fEGKEWIhBs-0-4a28440eb128bdc7f871a683d8691b90)
上面的代码结构在逻辑上并不那么优美,开发者的原意是当param参数大于0时才执行函数中的操作,在2.0之前却使用了相反的逻辑来中断函数,当然,开发者也可以将函数实现如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P73_16648.jpg?sign=1739318578-Pk0nVLYvF3EiHIrq83HKbVdiRw8rDpNI-0-163f878bad7960c2e023f109395435b6)
经过修改后,代码逻辑清晰了许多,然而还是有一些问题,如果这个函数中需要做的操作很多,那么所有条件判断的代码都将写在if语句块中,代码结构就显得杂乱无章,guard-else语句就是为了优化这种情况而产生的。guard-else语句也被称为守护语句,顾名思义,其作用就是确保某个条件成立才允许其后的代码执行,示例如下:
![](https://epubservercos.yuewen.com/21D3CA/23721705709589206/epubprivate/OEBPS/Images/Figure-P74_16650.jpg?sign=1739318578-nlgyhs6lXSDxzBzK5SJ89OXdMf6adZER-0-42081c7cf26f5c1e756e1a9473812219)