switch语句主要用于去匹配一个值的多种可能性,if…case语句则在检查条件时更有优势。当然switch还提供一系列强大的特性,比如之前的小节我们学习过的可以让开发者匹配区间、绑定值到本地常量或变量等。
有时候一个值可能与很多分支都可以匹配,但是开发者只关心其中一种情况,这时开发者便会忍不住使用switch语句。举个例子,想象一下检查一个Int类型的年龄常量来寻找特定年龄段的人口,比如25~35岁(也被称为“主力消费群体”),读者可能会觉得写一个只有一个分支的switch语句是最好的选择,代码如下:
动手写4.2.7 MainConsumerForce
变量age的值初始化为28。age可能是0~200中的任意数字,但是开发者只对某个特殊区间感兴趣,switch会检查age是否介于25和35之间。如果是,那么age就处于所需匹配的人口年龄区间中,接着就可以执行相应的代码;否则,default分支会匹配,它只是简单地用break控制转移语句把代码执行转移到switch外面。
注意,这里必须有default分支,之前已经强调过了switch语句必须被全覆盖。如果读者觉得这段代码不顺眼,那就对了。这里不需要做什么,所以用了break,不需要做什么的时候不写代码是最好的!Swift提供了一种更好的方式实现这种逻辑。前面的小节中我们已经学习了if…else语句,Swift也有if…case语句来提供类似于switch语句的模式匹配能力,可以将之前的匹配逻辑换成“=”:
动手写4.2.8 MainConsumerForceIfCase
控制台输出如下:
变量age的值初始化为28。age可能是0~200中的任意数字,但是开发者只对某个特殊区间感兴趣,switch会检查age是否介于25和35之间。如果是,那么age就处于所需匹配的人口年龄区间中,接着就可以执行相应的代码;否则,default分支会匹配,它只是简单地用break控制转移语句把代码执行转移到switch外面。
注意,这里必须有default分支,之前已经强调过了switch语句必须被全覆盖。如果读者觉得这段代码不顺眼,那就对了。这里不需要做什么,所以用了break,不需要做什么的时候不写代码是最好的!Swift提供了一种更好的方式实现这种逻辑。前面的小节中我们已经学习了if…else语句,Swift也有if…case语句来提供类似于switch语句的模式匹配能力,可以将之前的匹配逻辑换成“=”:
动手写4.2.8 MainConsumerForceIfCase
输出台控制如下:(www.xing528.com)
输出台控制如下:
这种语法优雅多了,只要简单地检查age是否在给定区间内,而不需要写一个开发者并不关注的default分支。if…case的语法能让开发者关注关键的分支:age是否处于25~35的区间内。if…case也可以像switch语句一样实现更复杂的模式匹配。比如判断age是否大于等于30,示例如下:
动手写4.2.9 MainConsumerForceIfCaseMore
这种语法优雅多了,只要简单地检查age是否在给定区间内,而不需要写一个开发者并不关注的default分支。if…case的语法能让开发者关注关键的分支:age是否处于25~35的区间内。if…case也可以像switch语句一样实现更复杂的模式匹配。比如判断age是否大于等于30,示例如下:
动手写4.2.9 MainConsumerForceIfCaseMore
控制台输出如下:
控制台输出如下:
上面的新代码与前面的功能一样,但是有了些新的东西,逗号后面的代码会检查age是否大于等于30,也就是而立之年。if…case为只有一个分支的switch语句提供了优雅的解决方案,而且使switch语句中如此好用的模式匹配功能对if…case也是适用的。当开发者想用的switch语句只有一个分支,而且不关心default分支时,就可以用if…case,因为if…case就是具备更强大模式匹配功能的 if…else。如果用通常的else块就意味着其实写了default分支,也就没有必要用if…case了。
上面的新代码与前面的功能一样,但是有了些新的东西,逗号后面的代码会检查age是否大于等于30,也就是而立之年。if…case为只有一个分支的switch语句提供了优雅的解决方案,而且使switch语句中如此好用的模式匹配功能对if…case也是适用的。当开发者想用的switch语句只有一个分支,而且不关心default分支时,就可以用if…case,因为if…case就是具备更强大模式匹配功能的 if…else。如果用通常的else块就意味着其实写了default分支,也就没有必要用if…case了。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。