![Swift 4从零到精通iOS开发](https://wfqqreader-1252317822.image.myqcloud.com/cover/794/26846794/b_26846794.jpg)
4.5 Swift语言中的流程跳转语句
跳转语句可以提前中断循环结构,也可以人为控制选择结构的跳转,使代码的执行更加灵活多变。Swift中提供了大量的流程跳转语句供开发者使用,熟悉这些语句的结构与特点可以使开发效率大大提高。Swift中提供的流程跳转语句主要有continue、break、fallthrough、return、throw、guard。
continue语句用于循环结构中,其作用是跳过本次循环,直接开始下次循环。这里需要注意,continue的作用并不是跳出循环结构,而是跳过本次循环,直接执行下一个循环周期。示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P69_65795.jpg?sign=1739285456-QJGiDReuFnaNfYk0eiYH9sIU2qM9KPrc-0-f9e403b73a68eeb2d83897344ddabb2c)
上面的示例代码将跳过index等于6时的代码块,在打印信息中会缺少index等于6时的打印输出。需要注意的是,continue语句默认的操作范围是直接包含它的这一层循环结构,如果代码中嵌套了多层循环结构,continue语句会跳过本次循环。那么,如果想要实现不跳过本次循环,而是直接跳至开发者指定的那一层循环结构,该如何写呢?示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P69_65796.jpg?sign=1739285456-ZTjSA9YuT0MiQAiGRbVkfWPvNCOiS8jN-0-94a4ca6008879f4c5fc8cd83911752c7)
以上代码创建了两层循环结构,在内层循环中使用continue语句进行跳转,MyLabel是外层循环的标签,因此这里的continue跳转将会跳出indexI等于1时的外层循环,直接开始indexI等于2的循环操作。
break语句是中断语句,也可以用于循环结构中。和continue语句不同的是,break语句会直接中断直接包含它的循环结构,即当循环结构为一层时,如果循环并没有执行完成,则后面所有的循环都将被跳过。如果有多层循环结构,程序会直接中断直接包含它的循环结构,继续执行该循环结构外层的循环结构,示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P70_65797.jpg?sign=1739285456-Ws2RrjqXHzZDOobjZudJZxR7AaqHg4Ag-0-8aa1ee24b25b4424e6a5b850389ff9ec)
上面的代码在index等于6时使用了break语句进行中断,第5次循环后的所有打印信息都将被跳过。break语句默认将中断直接包含它的循环结构,同样也可以使用指定标签的方式来中断指定的循环结构,示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P70_65798.jpg?sign=1739285456-be0aij90kSWykSDtVAPaZkLmO8LDPuxS-0-f0ccfcfa5d1fe0c0ba93f7515f9eadaf)
break语句也可以用于switch结构中。在switch结构中,break语句将直接中断后面所有的匹配过程,直接跳出switch结构。在Swift语言中,switch-case选择匹配结构默认就是break操作,故开发者不必手动添加break代码。
fallthrough语句是Swift中特有的一种流程控制语句。前面提到过,当Swift语言中的switch-case结构匹配到一个case后会自动中断后面所有case的匹配操作。如果在实际开发中需要switch-case结构不自动进行中断操作,可以使用fallthrough语句,示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P70_65799.jpg?sign=1739285456-i6SFaumulvDrBF0C0HxAAtGq7b1IVx7m-0-ba1f6d82ce585ec04f674ab16758e26f)
如上示例代码将会打印Sure、Sim和SIM。
return语句对于读者来说应该十分熟悉,其在函数中用于返回结果值,也可以用于提前结束无返回值类型的函数。当然,return语句的应用场景也不只局限于函数中,在闭包中也可以使用return进行返回。关于函数的相关知识,会在后面的章节做详细的介绍,这里只做简单演示,示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P71_65800.jpg?sign=1739285456-y3qSitmQWeR8HIxnw0Xy0ohUalYSd53O-0-fd4507d592d84f986a6ee6c1f8b3ffe4)
throw语句用于异常抛出,throw语句抛出的异常如果不进行捕获处理,也会使程序中断。Swift语言中有抛出异常和处理异常的代码结构,在后面章节中会详细介绍,这里也只做简单演示。在函数中抛出异常的代码示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P71_65801.jpg?sign=1739285456-IfPRC1mID6izj43NeFpJpORxDrcYUAoG-0-2c637f420a0b4f08396377532a9ec69f)
guard-else结构语句是Swift 2.0之后新加入的一种语法结构,Swift团队创造它的目的在于使代码的结构和逻辑更加清晰。在实际开发中,尤其是在函数的编写中,经常会遇到这样的场景:就是当参数符合某个条件时,函数才能正常执行,否则直接通过return来终止函数的执行,如果不使用guard-else结构,示例代码如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P71_65802.jpg?sign=1739285456-bcAduOKevuqAtht7McBu8r0yUEqc7NDI-0-535d7c2caa6330d64813857e7dee844d)
上面的代码结构在逻辑上并不那么优美,开发者的原意是当param参数大于0时才执行函数中的操作,在2.0之前却使用了相反的逻辑来中断函数,当然,开发者也可以将函数实现为如下形式:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P71_65803.jpg?sign=1739285456-tCBIMHx3VeqanYj3IBFRA2Twpz4Jofmm-0-1f7a07e37b18c4a881fc80b3ef8b4ce0)
经过修改后,代码逻辑清晰了许多,然而还是有一些问题。如果这个函数中需要做的操作很多,那么所有条件判断的代码都将写在if语句块中,代码结构就会显得杂乱无章。guard-else语句就是为了优化这种情况而产生的。guard-else语句也被称为守护语句,顾名思义,其作用就是确保某个条件成立才允许其后的代码执行。示例如下:
![](https://epubservercos.yuewen.com/BD6CFE/15289822004505406/epubprivate/OEBPS/Images/Figure-P72_65804.jpg?sign=1739285456-g2zMYYEawLmuKerBPFCZvBLaGIlZRUa8-0-8ab907832d8f5558f8c1e2076227c677)