在本文中,您將學(xué)習(xí)使用switch控制語(yǔ)句來(lái)控制程序執(zhí)行的流程。
switch語(yǔ)句也是多種Swift控制語(yǔ)句,例如if-else,guard等,它們根據(jù)不同的條件執(zhí)行不同的動(dòng)作。
switch語(yǔ)句的優(yōu)點(diǎn)在于,它可以將值與幾種可能的匹配模式進(jìn)行比較。 因此,它可以代替長(zhǎng)if..else..if梯形圖,同時(shí)匹配復(fù)雜模式。
switch語(yǔ)句的語(yǔ)法為:
switch 變量/表達(dá)式 {
case value1:
// 語(yǔ)句
case value2:
// 語(yǔ)句
default:
// 語(yǔ)句
}switch 表達(dá)式只計(jì)算一次。
它接受表達(dá)式并按順序(上->下)與每個(gè)case值進(jìn)行比較。
如果存在匹配項(xiàng),則執(zhí)行 case 內(nèi)的語(yǔ)句,并且第一個(gè)匹配的 switch case 一旦完成,整個(gè)switch語(yǔ)句就結(jié)束執(zhí)行。
如果沒(méi)有匹配的case,則落到下一個(gè)case語(yǔ)句。
如果都沒(méi)有匹配到case,則default關(guān)鍵字指定要運(yùn)行的代碼。

注意:每個(gè) case 的主體必須至少包含一個(gè)可執(zhí)行語(yǔ)句。
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")
}當(dāng)您運(yùn)行上述程序時(shí),輸出將是:
Wednesday
在上面的程序中,switch語(yǔ)句通過(guò)將dayOfWeek值與 case 1匹配來(lái)開(kāi)始。由于dayOfWeekvalue與第一種情況的值不匹配,因此它會(huì)降到下一種情況,直到其中一個(gè)匹配。
由于case 4與switch表達(dá)式匹配,因此case內(nèi)部的 print("Wednesday") 語(yǔ)句將被執(zhí)行,并且switch case終止。如果沒(méi)有case匹配,則執(zhí)行default內(nèi)部的語(yǔ)句。
如果在 case 語(yǔ)句中使用 fallthrough 關(guān)鍵字,即使 case 值與 switch 表達(dá)式不匹配,控制也會(huì)繼續(xù)進(jìn)行下一個(gè) 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")
}當(dāng)您運(yùn)行上述程序時(shí),輸出將是:
Wednesday Thursday
在上面的程序中,case 4 執(zhí)行語(yǔ)句 print("Wednesday") ,fallthrough 關(guān)鍵字會(huì)繼續(xù)執(zhí)行 case 5。case 5中的語(yǔ)句 print("Thursday") 被執(zhí)行,即使 cas 與 switch 表達(dá)式不匹配。因此,您可以在控制臺(tái)中還看到輸出 Thursday 。
let programmingLanguage = (name: "Go", version: 10)
switch programmingLanguage {
case (let name,let version) where (version < 0 && name.count < 0) :
print("輸入無(wú)效")
case ("Swift",let version) where version == 4:
print("找到最新版本的Swift")
case ("Swift" , ..<4 ):
print("找到舊版本的swift")
case ("Swift" ,4...) :
print("Swift版本大于4還沒(méi)有發(fā)布")
case ("Taylor Swift",30) :
print("我的天啊。 這是泰勒·斯威夫特")
case (let name, let version):
print("""
編程語(yǔ)言:\(name)
版本: \(version)
狀態(tài): Not found
""")
}當(dāng)您運(yùn)行上述程序時(shí),輸出將是:
編程語(yǔ)言:Go 版本: 10 狀態(tài): Not found
在上面的程序中,我們將元組類(lèi)型的表達(dá)式 programmingLanguage 與以下不同的情況進(jìn)行匹配:
case (let name,let version) where (version < 0 && name.count < 0)
本示例將 switch 表達(dá)式值綁定到臨時(shí)常量或變量,以便使用 let 關(guān)鍵字在大小寫(xiě)體中使用。這被稱(chēng)為值綁定。
您還可以使用where子句將條件應(yīng)用于這些值。 對(duì)于多個(gè)條件,您可以使用&&運(yùn)算符將它們連接起來(lái),如上例所示。
如果case不滿足where子句中定義的條件,則這些case塊中的語(yǔ)句將不執(zhí)行,并且無(wú)法通過(guò)比較下一個(gè)switch case。
case ("Swift" , ..<4 )
這種情況下,將元組的第一個(gè)元素與字符串字面量"Swift"匹配,還會(huì)檢查第二個(gè)元素是否在單邊范圍內(nèi)..<4。
case ("Swift" ,4...)
這種情況下,將元組的第一個(gè)元素與字符串字面量"Swift"匹配,還會(huì)檢查第二個(gè)元素是否在單邊范圍內(nèi)4…。
case (let name, let version)
這種情況將元組的每個(gè)值綁定到臨時(shí)常量或變量。