# Swift Switch介紹
## Switch簡介
Switch作為選擇結構中必不可少的語句也被加入到了Swift中,只要有過編程經驗的人對Switch語句都不會感到陌生,但蘋果對Switch進行了大大的增強,使其擁有其他語言中沒有的特性。使用Switch語句很簡單:
~~~
var?i?=?0??
switch?i?{??
????case?0:??
????????"0"?//被輸出??
????case?1:??
????????"1"??
????default:??
????????"2"??
}??
~~~
在這個最簡單的Switch語句中,與其他語言很不同的一點是:不用顯式的加上break。Swift的Switch語句會自動在case結尾處加上break,執行完滿足條件的case部分后,就自動退出了。但是在某些情況下,我們可能會希望Switch能同時執行兩條case,那么可以這樣:
~~~
var?i?=?3??
switch?i?{??
????case?0,3:??
????????"0"?//被輸出??
????case?1:??
????????"1"??
????default:??
????????"2"??
}??
~~~
在case后的多個條件中,用逗號隔開即可。
如果就是想執行完一條case之后,想繼續執行下一條case,就要用到一個新的關鍵字:
~~~
var?i?=?0??
switch?i?{??
????case?0:??
????????"0"?//被輸出??
????????fallthrough??
????case?1:??
????????"1"?//被輸出??
????case?2:??
????????"2"??
????default:??
????????"default"??
}??
~~~
使用新的關鍵字**fallthrough**能使Switch在執行完一個case之后,緊接著執行下一條case。
Swift的Switch語句一定要**涵蓋**所有的情況,這并不是說一定要有default,只要上面的case能滿足所有的情況,就可以不用寫default。
需要注意的地方有兩點:
* Switch當然也支持顯式的break,通常只有一種情況下你會這么做,那就是當你也不想在default里做任何事情的時候,這個時候你就可以在default里顯式地加上一句break。
* fallthrough并不是在任何情況下都有效,當你在Switch里使用Value Binding技術的時候,fallthrough就被禁止了。Value Binding在下面會講到。
## 支持多種數據類型
在Objective-C里,Switch語句只能支持整形的數據(或者一個字符),但是在Swift里,Switch能支持多種數據類型,包括浮點、布爾、字符串等:
支持浮點:
~~~
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"??
}??
~~~
可以說是史上支持數據類型最多的Switch了。
## 支持區間運算符
不僅僅是循環結構里可以用區間運算符,在Switch里同樣可以用區間運算符:
~~~
var?i?=?15??
switch?i?{??
????case?0?...?10:??
????????"0~10"??
????case?11?...?20:??
????????"11~20"?//被輸出??
????default:??
????????"default"??
}??
~~~
對某個數值區間進行批量匹配,這樣是不是很酷?浮點數也同樣支持區間運算符。
## 支持元組
作為被大大增強的Switch,元組也是被支持的:
~~~
let?request?=?(true,"success")??
switch?request?{??
????case?(true,?"success"):??
????????"success"???//被輸出??
????case?(false,?"failed"):??
????????"failed"??
????default:??
????????"default"??
}??
~~~
使用元組和使用其他數據類型一致,不過元組還有一項特點,對于不想關心的值,可以用下劃線_跳過,如:
` let?(name,??_,?age)?=?("Bannings"?,true,?22)??`
那么在使用Switch時,同樣支持這項特性:
~~~
let?request?=?(true,"success")??
switch?request?{??
????case?(_,?"success"):??
????????"success"???//被輸出??
????case?(false,?_):??
????????"failed"??
????default:??
????????"default"??
}??
~~~
對于不關心的值跳過,只要滿足另一個值就行了。需要注意一點的是,如果元組中的值也是數字類型,那么也是可以用區間運算符的:
~~~
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是等價的。
當你在一個case里使用Value Binding的時候,如果你同時也在它的上一個case里使用了fallthrough,這是編譯器所不允許的,你可能會收到這樣一個編譯錯誤:
?
只要把下面的errorCode去掉就行了,當然,考慮好自己的邏輯。
## 支持額外的邏輯判斷
在使用Switch語句時,Switch會適當地導向相應的case部分,這其實就相當于做了一次邏輯判斷,但Swift的Switch語句還支持額外的邏輯判斷:
~~~
let?request?=?(0,"success")??
switch?request?{??
????case?(0,?let?state)?where?state?!=?"success":??
????????state??
????case?(let?errorCode,?_):??
????????"error?code?is?\(errorCode)"//被輸出:"error?code?is?0"??
}??
~~~
這同樣很酷,相信在某種情況下會派上大用場。
## 總結
Swift對Switch進行了大大增強,使Switch的靈活性得到了很大提升,這是激動人心的改變,但是如果掌控不好其中的變化,可能會使你在進行錯誤排查時增加難度,也會使代碼復雜度變高。在適當地時候靈活運用,保持頭腦清晰總是有益的。
- 前言
- iOS 自定義頁面的切換動畫與交互動畫 By Swift
- Swift 元組(Tuples)介紹
- Swift 可選值(Optional Values)介紹
- Swift Switch介紹
- Swift 值類型和引用類型
- Swift 柯里化(Currying)
- iOS GCD使用指南
- iOS8 Core Image In Swift:自動改善圖像以及內置濾鏡的使用
- 讓Xcode自動更新Build版本
- Swift 全功能的繪圖板開發
- Swift Nullability and Objective-C
- Swift Core Data 圖片存儲與讀取Demo
- Swift 繪圖板功能完善以及終極優化
- 如何設計一個 iOS 控件?(iOS 控件完全解析)