Swift中的條件切換語句switch...case學習教程_Swift

來源:互聯網
上載者:User

文法
Swift 語言中 switch 語句的文法:

複製代碼 代碼如下:

switch expression {
   case expression1  :
      statement(s)
      fallthrough /* 可選 */
   case expression2, expression3  :
      statement(s)
      fallthrough /* 可選 */

   default : /* 可選 */
      statement(s);
}


注意:在大多數語言中,switch 語句塊中,case 要緊跟 break,否則 case 之後的語句會順序運行,而在 Swift 語言中,預設是不會執行下去的,switch 也會終止。如果你想在 Swift 中讓 case 之後的語句會按順序繼續運行,則需要使用 fallthrough 語句。
需要注意的地方有兩點:
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的靈活性得到了很大提升,這是激動人心的改變,但是如果掌控不好其中的變化,可能會使你在進行錯誤排查時增加難度,也會使代碼複雜度變高。在適當地時候靈活運用,保持頭腦清晰總是有益的。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.