详解Swift的switch...case语句中break关键字的用法
与Objective-C中这部分内容相比,在Swift中switch得到了极大的改善。这是一件非常有趣的事,因为这还是没有添加到Objective-C中,还是没有打破Objective-C是C的超集的事实。
第一件令人兴奋的地方是可以对字符串转换。这也许正是你之前想要做,却不能做的事。在Objective-C中如果要对字符串用“switch”,你必须要使用多个if语句,同时要用isEqualToString:,像下面这样:
if([person.nameisEqualToString:@"MattGalloway"]){
NSLog(@"AuthorofaninterestingSwiftarticle");
}elseif([person.nameisEqualToString:@"RayWenderlich"]){
NSLog(@"Hasagreatwebsite");
}elseif([person.nameisEqualToString:@"TimCook"]){
NSLog(@"CEOofAppleInc.");
}else{
NSLog(@"Someoneelse);
}
这样可阅读性不强,也要打很多字。同样的功能在Swift中实现如下:
switchperson.name{
case"MattGalloway":
println("AuthorofaninterestingSwiftarticle")
case"RayWenderlich":
println("Hasagreatwebsite")
case"TimCook":
println("CEOofAppleInc.")
default:
println("Someoneelse")
}
除了对字符串可以使用switch之外,请注意这里一些有趣的事情。没有看见break。因为在switch中一个case语句执行完成后就不再向下执行。不会再偶然地出现bug!
再比如这样的情况下
letvegetable="redpepper"
switchvegetable{
case"celery":
letvegetableComment="Addsomeraisinsandmakeantsonalog."
case"cucumber","watercress":
letvegetableComment="Thatwouldmakeagoodteasandwich."
//switch支持所有类型的数据,以及多种比较运算——没有限制为必须是整数,也没有限制为必须测试相等(testsforequality真的是这样翻译的吗?)
caseletxwherex.hasSuffix("pepper"):
letvagetableComment="Isitaspicy\(x)?"
//switch语句要求必须覆盖所有的可能,否则报错'switchmustbeexhaustive,consideraddingadefaultcla'
default:
print("不能没有default")
}
不需要写break,
执行完匹配到的case后,程序会跳出switch,而不是继续执行下一个case,所以不需要在case的代码后面添加break来跳出switch。
下面的switch语句可能会扰乱你的思路,所以准备好了!
switchi{
case0,1,2:
println("Small")
case3...7:
println("Medium")
case8..10:
println("Large")
case_wherei%2==0:
println("Even")
case_wherei%2==1:
println("Odd")
default:
break
}
首先,这出现了一个break。因为switch必须要全面而彻底,它们需要处理所有的情况。在这种情况下,我们想要default时不做任何事,所以放置了一个break来表明此处不应该发生任何事。
接下来有趣的事情是你在上面看到的…和..,这些是新的操作符,用于来定义范围。前者用来定义范围包括右边的数字,后者定义的范围不包括右边的数字。它们真是超乎想象地有用。
最后一件事是可以把case定义成对输入值的计算。在上面这种情况下,如果这个值不匹配从0到10,如果是偶数打印“Even”,是奇数打印“Odd”。太神奇了!