上一章Swift教程请查看:swift if,if…else语句
在本文中,你将学习如何使用switch控制语句来控制程序的执行流。
switch语句也是Swift控制语句的一种,例如if-else、guard等,根据不同的条件执行不同的动作。
switch语句的优点在于,它可以将一个值与几个可能的匹配模式进行比较,因此,它可以代替if..else..if同时匹配复杂的模式。
switch语句的语法
switch语句的语法为:
switch variable/expression {
case value1:
// statements
case value2:
// statements
default:
// statements
}
Swift中的Switch语句是如何工作的?
- switch表达式求值一次。
- 它接受表达式并按顺序(Top -> Bottom)与每个大小写值进行比较。
- 如果存在匹配,则执行案例中的语句,并且一旦完成第一个匹配的switch案例,整个switch语句就完成执行。
- 如果没有匹配的情况,它下降到下一个情况。
- default关键字指定在没有大小写匹配的情况下运行的代码。
注意:每个案例的主体必须包含至少一个可执行语句。
例1:使用Switch语句的简单程序
let dayOfWeek = 4
switch dayOfWeek {
case 1:
print("Sunday")
case 2:
print("Monday")
case 3:
print("Tuesday")
case 4:
print("Wednesday")
case 5:
print("Thursday")
case 6:
print("Friday")
case 7:
print("Saturday")
default:
print("Invalid day")
}
在上面的程序中,switch语句首先将dayOfWeek值与case 1匹配,由于dayOfWeek值与第一个case值1不匹配,所以在匹配之前,它将一直保留到下一个case。
由于case 4与switch表达式匹配,case中的statementprint(“Wednesday”)执行,switch case终止。如果没有匹配大小写,则执行default中的语句。
示例2:使用fallthrough切换语句
如果在case语句中使用fallthrough关键字,即使case值与switch表达式不匹配,该控件也会继续处理下一个case。
let dayOfWeek = 4
switch dayOfWeek {
case 1 :
print("Sunday")
case 2:
print("Monday")
case 3:
print("Tuesday")
case 4:
print("Wednesday")
fallthrough
case 5:
print("Thursday")
case 6:
print("Friday")
case 7:
print("Saturday")
default:
print("Invalid day")
}
在上面的程序中,case
4执行语句print(“Wednesday”),fallthrough关键字执行case5。即使case与switch表达式不匹配,case 5中的print语句(“Thursday”)也会执行,因此,你可以在控制台中看到周四的输出。
示例3:使用更复杂模式的Switch语句
let programmingLanguage = (name: "Go", version: 10)
switch programmingLanguage {
case (let name,let version) where (version < 0 && name.count < 0) :
print("无效的输入")
case ("Swift",let version) where version == 4:
print("发现最新版本的Swift")
case ("Swift" , ..<4 ):
print("发现了旧版本的swift)")
case ("Swift" ,4...) :
print("大于4的Swift版本还没有发布")
case ("Taylor Swift",30) :
print("OMG. This is Taylor swift")
case (let name, let version):
print("""
编程语言:\(name)
Version: \(version)
Status: Not found
""")
}
在上面的程序中,我们将tupletype的表达式编程语言与以下不同的case进行匹配:
- case (let name,let version),其中(version < 0 && name.count<
0)
这种情况将switch表达式值绑定到临时常量或变量,以便在let关键字的情况中使用,这称为值绑定。
你还可以使用where子句将条件应用于这些值,对于多个where条件,可以使用&&操作符将它们连接起来,如上面示例所示。
如果case不满足where子句中定义的条件,那么case块中的语句将不执行,并通过比较下一个switch case。
- case(“Swift”,..< 4)
本例将tuple第一个元素与字符串文字“Swift”匹配,并检查第二个元素是否位于单侧的范围..<4。
- case(“迅速”,4……)
本例将tuple第一个元素与字符串文字“Swift”匹配,并检查第二个元素是否位于单侧的range4中……
- case (let name, let version)
这种情况将元组的每个值绑定到临时常量或变量。