Swift中的條件切換語句switch...case學(xué)習(xí)教程
語法
Swift 語言中 switch 語句的語法:
switch expression {
case expression1 :
statement(s)
fallthrough /* 可選 */
case expression2, expression3 :
statement(s)
fallthrough /* 可選 */
default : /* 可選 */
statement(s);
}
注意:在大多數(shù)語言中,switch 語句塊中,case 要緊跟 break,否則 case 之后的語句會順序運(yùn)行,而在 Swift 語言中,默認(rèn)是不會執(zhí)行下去的,switch 也會終止。如果你想在 Swift 中讓 case 之后的語句會按順序繼續(xù)運(yùn)行,則需要使用 fallthrough 語句。
需要注意的地方有兩點:
Switch當(dāng)然也支持顯式的break,通常只有一種情況下你會這么做,那就是當(dāng)你也不想在default里做任何事情的時候,這個時候你就可以在default里顯式地加上一句break。
fallthrough并不是在任何情況下都有效,當(dāng)你在Switch里使用Value Binding技術(shù)的時候,fallthrough就被禁止了。Value Binding在下面會講到。
支持多種數(shù)據(jù)類型
在Objective-C里,Switch語句只能支持整形的數(shù)據(jù)(或者一個字符),但是在Swift里,Switch能支持多種數(shù)據(jù)類型,包括浮點、布爾、字符串等:
支持浮點:
let float = 1.5
switch float {
case 1.5:
"1.5" //被輸出
default:
"default"
}
支持布爾:
let isSuccess = true
switch isSuccess {
case true:
"true" //被輸出
default:
"default"
}
支持字符串:
let name = "Bannings"
switch name {
case "Bannings":
"Bannings" //被輸出
default:
"default"
}
可以說是史上支持?jǐn)?shù)據(jù)類型最多的Switch了。
支持區(qū)間運(yùn)算符
不僅僅是循環(huán)結(jié)構(gòu)里可以用區(qū)間運(yùn)算符,在Switch里同樣可以用區(qū)間運(yùn)算符:
var i = 15
switch i {
case 0 ... 10:
"0~10"
case 11 ... 20:
"11~20" //被輸出
default:
"default"
}
對某個數(shù)值區(qū)間進(jìn)行批量匹配,這樣是不是很酷?浮點數(shù)也同樣支持區(qū)間運(yùn)算符。
支持元組
作為被大大增強(qiáng)的Switch,元組也是被支持的:
let request = (true,"success")
switch request {
case (true, "success"):
"success" //被輸出
case (false, "failed"):
"failed"
default:
"default"
}
使用元組和使用其他數(shù)據(jù)類型一致,不過元組還有一項特點,對于不想關(guān)心的值,可以用下劃線_跳過,如:
let (name, _, age) = ("Bannings" ,true, 22)
那么在使用Switch時,同樣支持這項特性:
let request = (true,"success")
switch request {
case (_, "success"):
"success" //被輸出
case (false, _):
"failed"
default:
"default"
}
對于不關(guān)心的值跳過,只要滿足另一個值就行了。需要注意一點的是,如果元組中的值也是數(shù)字類型,那么也是可以用區(qū)間運(yùn)算符的:
let request = (10,"failed")
switch request {
case (_, "success"):
"success"
case (1 ... 10, _):
"1~10" //被輸出
default:
"default"
}
Value Binding
針對元組,Switch還支持類似于Optional Binding的Value Binding,就是能把元組中的各個值提取出來,然后直接在下面使用:
let request = (0,"success")
switch request {
case (0, let state):
state //被輸出:success
case (let errorCode, _):
"error code is \(errorCode)"
} // 涵蓋了所有可能的case,不用寫default了
這樣也是可以的:
let request = (0,"success")
switch request {
case let (errorCode, state):
state //被輸出:success
case (let errorCode, _):
"error code is \(errorCode)"
}
把let放在外面和放在里面為每一個元素單獨寫上let是等價的。
當(dāng)你在一個case里使用Value Binding的時候,如果你同時也在它的上一個case里使用了fallthrough,這是編譯器所不允許的,你可能會收到這樣一個編譯錯誤:

只要把下面的errorCode去掉就行了,當(dāng)然,考慮好自己的邏輯。
支持額外的邏輯判斷
在使用Switch語句時,Switch會適當(dāng)?shù)貙?dǎo)向相應(yīng)的case部分,這其實就相當(dāng)于做了一次邏輯判斷,但Swift的Switch語句還支持額外的邏輯判斷:
let request = (0,"success")
switch request {
case (0, let state) where state != "success":
state
case (let errorCode, _):
"error code is \(errorCode)"http://被輸出:"error code is 0"
}
這同樣很酷,相信在某種情況下會派上大用場。
總結(jié)
Swift對Switch進(jìn)行了大大增強(qiáng),使Switch的靈活性得到了很大提升,這是激動人心的改變,但是如果掌控不好其中的變化,可能會使你在進(jìn)行錯誤排查時增加難度,也會使代碼復(fù)雜度變高。在適當(dāng)?shù)貢r候靈活運(yùn)用,保持頭腦清晰總是有益的。
相關(guān)文章
Swift編程中用以管理內(nèi)存的自動引用計數(shù)詳解
這篇文章主要介紹了Swift編程中用以管理內(nèi)存的自動引用計數(shù)詳解,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-11-11Swift?中?Opaque?Types學(xué)習(xí)指南
這篇文章主要為大家介紹了Swift?中?Opaque?Types學(xué)習(xí)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPr
這篇文章主要為大家介紹了Swift高階函數(shù)contains?allSatisfy?reversed?lexicographicallyPrecedes用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06