官术网_书友最值得收藏!

4.4 條件選擇與多分支選擇結構

在開發中有兩種重要的流程結構,即循環結構與分支結構,循環結構用于處理大量的重復操作,分支結構則用于處理由條件差異而產生的代碼分支路徑。Swift語言中提供的分支結構有if結構、if-else結構與switch-case結構。

4.4.1 if與if-else條件選擇結構

if與if-else結構語句是Swift語言中基礎的分支結構語句,開發者可以使用單個if語句進行單條件分支,也可以使用if與else組合來實現多條件分支,示例如下:

提示

(1)需要注意,if關鍵字后面跟的條件必須為嚴格意義上的邏輯值或者結果為邏輯值的表達式。這點Swift語言和C/Objective-C語言有一定差異。

(2)if-else組合結構每個分支是互斥的,只能有一個分支的代碼被執行,條件的判斷順序會從上到下進行,直到找到一個判斷條件為真的分支或者最后一個else語句。同時,開發者也可以不加單獨的else語句,這種情況下,如果沒有條件成立的分支,則任何分支都不會被執行,程序會繼續向后執行。

4.4.2 switch-case多分支選擇結構

switch語句也被稱為開關選擇語句,它通過匹配的方式來選擇要執行的代碼塊,Swift語言中的switch語句更加強大,不像C/Objective-C中的switch語句只能進行int類型值的匹配,Swift語言中的switch語句可以進行任意數據類型的匹配,并且case子句的語法和擴展都更加靈活。使用switch結構進行字符分支匹配的示例如下:

如以上代碼所示,switch關鍵字后面需要填寫要進行分支匹配的元素,在switch結構中通過子句case的列舉進行元素值的匹配,匹配成功后,會執行相應case子句中的代碼,如以上代碼將打印字符串“chara is b”。default為switch語句中的默認匹配語句,即如果前面所有的case子句都沒有匹配成功,則會執行default中的代碼,開發者也可以將default子句省略,這時如果所有case子句都沒有匹配上,則會跳過switch結構,直接執行后面的代碼。

還有一點讀者需要注意,在C/Objective-C語言中,case語句不會因匹配成功而中斷,如果不進行手動控制,switch結構中的case子句會依次進行匹配執行。舉一個例子,如果第1個case子句匹配成功,第2個case子句也匹配成功,則第1個case子句和第2個case子句中的代碼都會執行,因此C/Objective-C程序開發中,開發者一般會在每個case子句后面添加break關鍵字進行手動中斷。Swift語句優化了這一點,一個case語句匹配成功后,會自動跳出switch結構,如果不進行特殊處理,switch結構中的分支只會被執行一個或者一個也不執行。

switch-case結構也支持開發者在一個case子句中編寫多個匹配條件,程序在執行到這個case子句時,只要有一個條件匹配成功,就會執行此case下的代碼,示例如下:

case子句的匹配條件也可以是一個區間范圍,當要匹配的參數在這個區間范圍內時,就會執行此case下的代碼,示例如下:

從上面的示例中可以了解,Swift語言中的switch-case結構十分靈活強大,如果將switch-case結構和元組結合使用,開發者在編寫代碼時將更加靈活多變。首先,對于元組類型參數的匹配,case子句可以進行選擇匹配和優化匹配,示例如下:

如以上代碼所示,在進行元組的匹配時,有3種方式可以選擇:第1種方式是完全匹配,即元組中所有元素都必須完全相等,才算匹配成功;第2種方式是選擇匹配,即開發者只需要指定元組中的一些元素進行匹配,不需要關心的元素可以使用匿名參數標識符來代替,這種方式下,只要指定的參數都相等,就算匹配成功;第三種方式是范圍匹配,即相應位置指定的范圍包含需匹配元組相應位置的值,就算匹配成功。其中第2種匹配方式可以和第3種匹配方式組合使用。

Swift語言中的case子句中還可以捕獲switch元組的參數,在相應的case代碼塊中可以直接使用捕獲到的參數,這在開發中可以簡化所編寫的代碼,示例如下:

這里讀者需要注意,要捕獲的元素并不能起到匹配的作用,例如元組tuple中有兩個元素,如果case條件為(let a,1),則在進行匹配時會匹配tuple中第2個參數,如果匹配成功,則會將tuple元組的第1個參數的值傳遞給a常量,并且執行此case中的代碼塊,在這個代碼塊中,開發者可以直接使用常量a。因此,要捕獲的元素在匹配時實際上充當著匿名標識符的作用,如以上代碼中的第3個case子句,其條件為let(a,b),實際上這個條件始終會被匹配成功。并且,如果開發者對元組中的所有元素都進行了捕獲,在代碼表現上,可以寫作(let a,let b),也可以直接捕獲整個元組,寫作let(a,b),這兩種方式只是寫法上有差異,在使用時并無差別。

switch-case結構的參數捕獲語法在使用起來為開發者帶來了不少的便利。然而其也有一個問題,它將所有要捕獲的元素都作為匿名參數來進行匹配,有時候并不是開發者想要的結果。例如上面的tuple元組,開發者需要捕獲元組中的第1個元素,同時又需要與第1個元素相關的條件成立時再使case子句匹配成功,針對這種情況,Swift中也提供了相應的辦法來處理,可通過在case語句中追加where條件的方式來實現上述需求,示例如下:

主站蜘蛛池模板: 金阳县| 饶河县| 施甸县| 麻栗坡县| 垣曲县| 垣曲县| 翁牛特旗| 龙井市| 明溪县| 弥勒县| 垫江县| 隆安县| 蒙城县| 金华市| 阿拉善左旗| 长泰县| 兴城市| 镇沅| 潼南县| 吉安市| 横峰县| 山西省| 荔波县| 山东省| 清涧县| 垣曲县| 大悟县| 读书| 株洲县| 依安县| 和平县| 鄂托克旗| 南岸区| 柳林县| 万安县| 南安市| 茌平县| 冕宁县| 江口县| 香港| 万宁市|