<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 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,這是編譯器所不允許的,你可能會收到這樣一個編譯錯誤: ?![](https://box.kancloud.cn/2016-01-18_569ca449d5bcd.jpg) 只要把下面的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的靈活性得到了很大提升,這是激動人心的改變,但是如果掌控不好其中的變化,可能會使你在進行錯誤排查時增加難度,也會使代碼復雜度變高。在適當地時候靈活運用,保持頭腦清晰總是有益的。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看