Swift流程控制之循環(huán)語句和判斷語句詳解_第1頁
Swift流程控制之循環(huán)語句和判斷語句詳解_第2頁
Swift流程控制之循環(huán)語句和判斷語句詳解_第3頁
Swift流程控制之循環(huán)語句和判斷語句詳解_第4頁
Swift流程控制之循環(huán)語句和判斷語句詳解_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、Swift流程控制之循環(huán)語句和判斷語句詳解Swift提供了所有c類語言的控制流結(jié)構(gòu)。包括for和while循環(huán)來執(zhí)行一個任務(wù)多次;if和switch語句來執(zhí)行確定的條件下不同的分支的代碼;break和continue關(guān)鍵字能將運行流程轉(zhuǎn)到你代碼的另一個點上。除了C語言傳統(tǒng)的for-condition-increment循環(huán),Swift加入了for-in循環(huán),能更加容易的遍歷arrays, dictionaries, ranges, strings等其他序列類型。Swift的switch語句也比C語言的要強大很多。 Swift中switch語句的case語句不會“掉入”下一個case,避免了c語

2、言忘記寫break語句產(chǎn)生的錯誤。 case可以匹配許多不同的模式,包括范圍匹配,元組匹配或者拋給指定的類型。匹配值在一個case條件下可以綁定到臨時常量或變量,可以在case的代碼塊中使用,復(fù)雜匹配條件下可以表示為每一個case的條件一、For Loops - For循環(huán)for循環(huán)用來多次執(zhí)行一組語句 ,Swift提供了兩種形式:1.for-in執(zhí)行范圍,序列,集合或級數(shù)等每一項中的一組語句2.for-condition-increment執(zhí)行一組語句直到確定的條件出現(xiàn),通常在每一個循環(huán)結(jié)束前遞增一個計數(shù)For-In循環(huán)使用for-in來遍歷集合中的項目,比如數(shù)組的范圍,排列中的項或者字符串

3、中的字符。下面的例子打印了表中的5個元素復(fù)制代碼 代碼如下:for index in 1.5 println("(index) times 5 is (index * 5)")/ 1 times 5 is 5/ 2 times 5 is 10/ 3 times 5 is 15/ 4 times 5 is 20/ 5 times 5 is 25 例子中被迭代集合的項是一個封閉范圍內(nèi)從1到5的數(shù)字,就是上面標(biāo)識為封閉范圍操作符的 (.)。 Index的值被設(shè)為第一個數(shù)據(jù)的范圍(1), 然后執(zhí)行循環(huán)中的語句。在本例中,循環(huán)只包含了一句話,根據(jù)index現(xiàn)有的值打印5次乘法表的一個

4、結(jié)果。當(dāng)執(zhí)行完語句之后,index的值被更新為范圍中的第二個值,然后再次調(diào)用println函數(shù)。這個操作會一直持續(xù),直到范圍的終點。在上面的例子中,index是一個常量,它的值在每次迭代的開始時自動初始化,使用前不會被聲明,就是簡單的將其隱性聲明納入循環(huán)的聲明,不需要使用let來聲明關(guān)鍵字。復(fù)制代碼 代碼如下:NOTE:Index常量僅僅存在于循環(huán)的范圍內(nèi)。如果你想要在循環(huán)之后得到index的值,或者想要使用index的值作為變量,你必須在循環(huán)之前聲明它。如果不需要范圍的值,可以用下劃線替代變量名來忽略這些值:復(fù)制代碼 代碼如下:let base = 3let power = 10var an

5、swer = 1for _ in 1.power answer *= baseprintln("(base) to the power of (power) is (answer)")/ prints "3 to the power of 10 is 59049"例子中計算兩數(shù)相乘(在本例中,3乘以10)。乘法初始值為1,每次乘3,乘10次,使用半封閉循環(huán)從0到9。這個計算不需要通過循環(huán)來知道每個計數(shù)器的值-僅僅只需要執(zhí)行正確的循環(huán)次數(shù)。下劃線操作符 _ (用于替代循環(huán)變量)將忽略掉個體值,并且在每一次循環(huán)迭代期間不給現(xiàn)有的變量提供訪問。使用for-in

6、循環(huán)來迭代出array中的每一個項:復(fù)制代碼 代碼如下:let names = "Anna", "Alex", "Brian", "Jack"for name in names println("Hello, (name)!")/ Hello, Anna!/ Hello, Alex!/ Hello, Brian!/ Hello, Jack!同樣可以迭代字典來訪問其中的鍵值對。當(dāng)?shù)值鋾r里面的每一個項都以(key,value)元組的形式來返回,你可以在for-in的循環(huán)體中分解 (key, va

7、lue) 元組的成員,把成員作為顯性命名的常量來使用。下面例子,字典的key被分解為animalName的常量,字典的值被分解名為legCount的常量:復(fù)制代碼 代碼如下:let numberOfLegs = "spider": 8, "ant": 6, "cat": 4for (animalName, legCount) in numberOfLegs println("(animalName)s have (legCount) legs")/ spiders have 8 legs/ ants have 6

8、legs/ cats have 4 legsDictionary中的項的迭代順序可能跟它們插入時的順序不一樣。因為Dictionary中的內(nèi)容本質(zhì)上是無序的,所以迭代它們不能保證檢索時的順序。更多關(guān)于排列和字典的內(nèi)容詳見 Collection Types章節(jié)。除了排列和字典,for-in循環(huán)還能迭代字符串中的Character(字符):復(fù)制代碼 代碼如下:for character in "Hello" println(character)/ H/ e/ l/ l/ oFor-Condition-Increment For-條件-遞增除了for-in循環(huán),Swift還支持傳

9、統(tǒng)C語言按條件遞增的for循環(huán)復(fù)制代碼 代碼如下:for var index = 0; index < 3; +index println("index is (index)")/ index is 0/ index is 1/ index is 2這是常用的形式:復(fù)制代碼 代碼如下:for <initialization> <condition> <increment> <statements>封號把循環(huán)定義隔為了三個部分,跟C語言一樣。然而與C不同的是,Swift不需要用括號把 “初始化; 條件; 增量” 的代碼塊包

10、起來。循環(huán)按照下面流程執(zhí)行:1.當(dāng)循環(huán)第一次進入,initialization expression(初始化表達(dá)式)計算一次,設(shè)置好循環(huán)所需的常量或者變量。2.計算condition expression(條件表達(dá)式)。如果計算結(jié)果為false(假),循環(huán)終止,并繼續(xù)執(zhí)行for循環(huán)尾括號()后面的代碼。如果結(jié)果為(true)真,則執(zhí)行循環(huán)體大括號內(nèi)的代碼。3.在所有的語句執(zhí)行完后,計算increment expression(增量表達(dá)式)。計數(shù)器可能遞增或遞減,也可能根據(jù)語句執(zhí)行的結(jié)果將初始化變量設(shè)為新的值。計算完增量表達(dá)式返回到第2步,條件表達(dá)式再次被計算。上面描述的循環(huán)體的形式和執(zhí)行過程可

11、以簡單的等同于:復(fù)制代碼 代碼如下:<initialization>while <condition> <statements><increment>常量和變量在初始化表達(dá)式中的聲明(比如var index = 0)只在for循環(huán)自己內(nèi)部有效。如果需要知道index最終的值,必須在循環(huán)開始前聲明index:復(fù)制代碼 代碼如下:var index: Intfor index = 0; index < 3; +index println("index is (index)")/ index is 0/ index is 1/

12、 index is 2println("The loop statements were executed (index) times")/ prints "The loop statements were executed 3 times"注意,循環(huán)完成后index最終的值是3,不是2。最后一次執(zhí)行增量表達(dá)式調(diào)用了+index,把index設(shè)為3,使得index<3等于false,循環(huán)結(jié)束。二、While Loops - While循環(huán)while循環(huán)在條件變?yōu)閒alse前執(zhí)行一組語句,這類循環(huán)最好用在第一個迭代開始前并不知道迭代器的數(shù)字的時候。S

13、wift提供了兩種while循環(huán):1.while 在每次通過循環(huán)的開頭計算條件2.do-while 在每次通過循環(huán)的結(jié)尾計算條件while循環(huán)一個while循環(huán)開始于計算單個的條件,如果條件為true,一組語句將重復(fù)直到條件變?yōu)閒alse。這是常見的while形式:復(fù)制代碼 代碼如下:while <condition> <statements>比如,玩這個叫Snakes and Ladders的游戲(或Chutes and Ladders):游戲的規(guī)則是這樣的:1.板子上有25個矩形,然后目標(biāo)是到達(dá)或超越25號方塊。2.每一輪,你先搖六面骰子,然后按照水平方向的虛線箭頭

14、移動到對應(yīng)數(shù)字的方塊上。3.如果走完落在梯子的底部,你可以爬上梯子。4.如果走完落在蛇的頭部,你可以走到那條蛇的尾部。這個游戲板由一個Int型數(shù)組展示出來。它的大小基于finalSquare常量,該常量用來初始化數(shù)組并在之后檢查勝利條件。游戲板初始化為26個值為0的Int型數(shù)據(jù),不是25個(分別位于0至25的索引):復(fù)制代碼 代碼如下:let finalSquare = 25var board = Int一些方塊給蛇與梯子設(shè)有具體的值。游戲板里,你能在有方塊有梯子腳的地方向上移動正數(shù),而有蛇頭的地方你只能向下移動負(fù)數(shù):復(fù)制代碼 代碼如下:board03 = +08; board06 = +11

15、; board09 = +09; board10 = +02board14 = -10; board19 = -11; board22 = -02; board24 = -08方塊3有梯子腳,所以你可以移動到方塊11。為了表述這個動作,board03等于+08,等同于一個整型數(shù)值8(即3和11的差)。一元運算符加運算符(+i)與一元減運算符(-i)相平衡,如果數(shù)值小于10就用0替代,這樣所板上的定義就對齊了。(風(fēng)格調(diào)整不是必須的,但代碼簡潔很有必要)玩家開始于方塊0,就在游戲板左下角的外面。第一下投骰是把玩家?guī)У接螒虬胬锩妫簭?fù)制代碼 代碼如下:var square = 0var diceRol

16、l = 0while square < finalSquare / roll the diceif +diceRoll = 7 diceRoll = 1 / move by the rolled amountsquare += diceRollif square < board.count / if we're still on the board, move up or down for a snake or a laddersquare += boardsquareprintln("Game over!")這個例子很簡單的模擬了投骰子。用隨機數(shù)的生成

17、器來替代,diceRoll從0開始。每一個while循環(huán),diceRoll通過自加運算符(+i)遞增,然后檢查是否過大。+diceRoll的返回值等于diceRoll自加以后的值。如果返回值等于7,骰子值則過大,重設(shè)為1。這樣diceRoll的值會一直是1,2,3,4,5,6,1,2等等。在搖骰子后,玩家根據(jù)diceRoll移動方塊。有可能骰子的數(shù)會讓玩家超過方塊25,這樣就算游戲結(jié)束。為了描述這個場景,代碼在向boardsquare添加值以前先檢查square的值是否少于board數(shù)組的count屬性,如果是則根據(jù)現(xiàn)有的square值將玩家上移或下移到相應(yīng)梯子或蛇。如果不執(zhí)行這個檢查,boa

18、rdsquare會可能嘗試取得board數(shù)組界限外的值,導(dǎo)致越界。如果square現(xiàn)在等于26,代碼將嘗試檢查board26,這個值超過了數(shù)組限制?,F(xiàn)有的While循環(huán)執(zhí)行到最后,會檢查循環(huán)條件看循環(huán)是否會再次執(zhí)行。如果玩家已經(jīng)移動或者方塊超過25,循環(huán)條件會計算為false,游戲結(jié)束。在這個例子中使用While循環(huán)是比較合適的,因為游戲的長度在循環(huán)的開頭不明確,讓循環(huán)一直執(zhí)行直到特定的滿足條件出現(xiàn)。Do-While循環(huán)While循環(huán)的另一個形式是do-while,在考慮循環(huán)條件前先執(zhí)行一次整個循環(huán)體,然后再繼續(xù)重復(fù)循環(huán)直到條件為false。下面是do-while的常見形式:復(fù)制代碼 代碼如下

19、:do <statements> while <condition>再來看看Snakes and Ladders的例子,用do-while而不是while來實現(xiàn)。finalSquare, board, square, 和diceRoll都用相同的方式初始化:復(fù)制代碼 代碼如下:let finalSquare = 25var board = Int(count: finalSquare + 1, repeatedValue: 0)board03 = +08; board06 = +11; board09 = +09; board10 = +02board14 = -10;

20、 board19 = -11; board22 = -02; board24 = -08var square = 0var diceRoll = 0在這個版本的游戲中,循環(huán)中第一個操作是檢查一個梯子或蛇。沒有梯子能直接把玩家?guī)У椒綁K25,所以不可能只爬一個梯子就贏了。因此在循環(huán)里先檢查梯子或蛇會更安全。游戲的開始,玩家在“方塊0”。 board0永遠(yuǎn)等于0,沒有別的功能:復(fù)制代碼 代碼如下:do / move up or down for a snake or laddersquare += boardsquare/ roll the diceif +diceRoll = 7 diceRoll

21、 = 1 / move by the rolled amountsquare += diceRoll while square < finalSquareprintln("Game over!")在代碼檢查后,開始搖骰子,玩家通過diceRoll方塊向前移動,該循一直環(huán)執(zhí)行到最后。循環(huán)條件(while square < finalSquare)跟之前例子一樣,但是這次會在第一次循環(huán)的結(jié)尾才計算。do-while循環(huán)的結(jié)構(gòu)比while循環(huán)更適合本例。上面do-while中,在循環(huán)條件確認(rèn)square仍舊在游戲板里面后,square += boardsquare會直

22、接進行計算,不必進行數(shù)組越界的檢查。三、Conditional Statements - 條件語句編程中常常根據(jù)不同的條件執(zhí)行不同的代碼,你可能會要代碼在出錯后運行額外的語句,或者當(dāng)數(shù)值越界時展示一個消息。我們可以用conditional(條件)來實現(xiàn)。Swift提供兩種方式來添加代碼的分支,常見的if和switch語句。顯然,用if語句來計算只有少量分支的的條件,而Switch用于更復(fù)雜的情況,特別是在模式匹配的時候有助于選擇合適的代碼分支來執(zhí)行。If語句在下面最簡單的例子里,if語句有一個if條件。所有的語句都只有在if條件為true的情況下才執(zhí)行:復(fù)制代碼 代碼如下:var temper

23、atureInFahrenheit = 30if temperatureInFahrenheit <= 32 println("It's very cold. Consider wearing a scarf.")/ prints "It's very cold. Consider wearing a scarf."前面的例子檢查了溫度是否等于32攝氏度。如果是則打印消息。否則不打印消息,直接執(zhí)行if語句大括號后面的代碼。if語句可以提供一個二選一的語句,常見的:else clause,用于當(dāng)if條件為false時。這些語句用els

24、e關(guān)鍵字來控制:復(fù)制代碼 代碼如下:temperatureInFahrenheit = 40if temperatureInFahrenheit <= 32 println("It's very cold. Consider wearing a scarf.") else println("It's not that cold. Wear a t-shirt.")/ prints "It's not that cold. Wear a t-shirt."兩個大括號中的一個被執(zhí)行。因為溫度增加超過了40攝氏

25、度,已經(jīng)不需要建議去帶圍巾,所以else分支被觸發(fā)。你可以使用多個if語句,像這樣增加條件:復(fù)制代碼 代碼如下:temperatureInFahrenheit = 90if temperatureInFahrenheit <= 32 println("It's very cold. Consider wearing a scarf.") else if temperatureInFahrenheit >= 86 println("It's really warm. Don't forget to wear sunscreen.&

26、quot;) else println("It's not that cold. Wear a t-shirt.")/ prints "It's really warm. Don't forget to wear sunscreen."這里增加的if語句用于應(yīng)對極端炎熱的情況。最后的else條件保留,打印既不冷也不熱的情況。最后的else條件是可選的,因此如果不需要寫完整可以去掉。復(fù)制代碼 代碼如下:temperatureInFahrenheit = 72if temperatureInFahrenheit <= 32 pr

27、intln("It's very cold. Consider wearing a scarf.") else if temperatureInFahrenheit >= 86 println("It's really warm. Don't forget to wear sunscreen.")在這個例子中,溫度既不冷也不熱才能觸發(fā)if或者else條件來打印信息。Switch語句Switch語句用一個值來匹配相對應(yīng)的幾個匹配模式。然后執(zhí)行相對應(yīng)的代碼塊,基于一開始匹配成功的模式。switch語句提供了應(yīng)對多種選擇情況的處理

28、來替代if語句。最簡單的形式,switch比較一個值對應(yīng)的一個或者多個相同形式的值:復(fù)制代碼 代碼如下:switch some value to consider case value 1:respond to value 1case value 2,value 3:respond to value 2 or 3default:otherwise, do something else每個switch語句由多個可能的case(情況)構(gòu)成,都用標(biāo)記的case關(guān)鍵字開頭。除了比較對應(yīng)的值,Swift還為每種case應(yīng)對更復(fù)雜的匹配模式提供了幾種方法,后面章節(jié)再說。每一個switch語句都必須exha

29、ustive(詳細(xì)),并且每一個所考慮類選可能的值都必須匹配switch中的一個case。如果不能對應(yīng)到switch中的所有case的值,可以定義個默認(rèn)的選取器來解決。選取器用default關(guān)鍵字來表示,必須出現(xiàn)在最后。下面的例子用switch語句匹配了一個小寫字符,someCharacter:復(fù)制代碼 代碼如下:let someCharacter: Character = "e"switch someCharacter case "a", "e", "i", "o", "u"

30、;:println("(someCharacter) is a vowel")case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m","n", "p", "q", "r", "s", "t", "v

31、", "w", "x", "y", "z":println("(someCharacter) is a consonant")default:println("(someCharacter) is not a vowel or a consonant")/ prints "e is a vowel"Switch語句第一個case匹配了5個小寫的元音字母。相似地,第二個case匹配所有的輔音小寫字母。case中并不需要寫上所有其他的英語字母,所以s

32、witch提供了default來匹配其他所有不是元音也不是輔音的情況。這樣的條件保證了switch沒有遺漏。No Implicit Fallthrough - 沒有隱性掉入相比C和objective-c中的switch語句,Swift中(如果忘了寫break)的switch不會默認(rèn)的掉落到每個case的下面進入另一個case。相反,switch語句當(dāng)?shù)谝粋€遇到的case完成時就完成了它整個的執(zhí)行,不需要寫break。因此比起C語言,swift的switch更加安全和簡單,避免了執(zhí)行多個case的錯誤。NOTE:如果你需要,仍舊可在case執(zhí)行完以前跳出來,詳見:Break in a Switc

33、h Statement見下面章節(jié)每個case的主干包括只少一個可執(zhí)行的語句。下面這樣寫是無效的,因為第一個case是空的:復(fù)制代碼 代碼如下:let anotherCharacter: Character = "a"switch anotherCharacter case "a":case "A":println("The letter A")default:println("Not the letter A")/ this will report a compile-time error不像C

34、語言中的Switch,這里的switch語句不能匹配"a"和"A"。比如,case "a"會在編譯時報錯:沒有找到任何可執(zhí)行語句。盡可能的避免了意外從一個case掉入另一個,這樣使代碼更安全。如果有多個匹配對象的,可以用逗號隔開,像下面這樣寫成多行:復(fù)制代碼 代碼如下:switch some value to consider case value 1,value 2:statements復(fù)制代碼 代碼如下:NOTE:為特別的switch case選擇掉落行為,可以使用fallthrough關(guān)鍵字,在下文中詳解Range Matchi

35、ng - 范圍匹配switch中case的值可以檢查他們內(nèi)在的范圍。這個例子使用數(shù)字范圍可以提供任意大小數(shù)字的自然語言計數(shù)。復(fù)制代碼 代碼如下:let count = 3_000_000_000_000let countedThings = "stars in the Milky Way"var naturalCount: Stringswitch count case 0:naturalCount = "no"case 1.3:naturalCount = "a few"case 4.9:naturalCount = "s

36、everal"case 10.99:naturalCount = "tens of"case 100.999:naturalCount = "hundreds of"case 1000.999_999:naturalCount = "thousands of"default:naturalCount = "millions and millions of"println("There are (naturalCount) (countedThings).")/ prints "

37、;There are millions and millions of stars in the Milky Way."Tuples 元組你可以使用元組在相同的switch語句中測試多個值。每一個元組中的元素都可以試著和范圍中不同的值進行匹配。另外,用下劃線(_)標(biāo)示符來匹配任意可能的值。下面例子中使用一個點坐標(biāo)(x,y),用元組型(Int, Int)來表示,可以在下面的圖中分類出來:復(fù)制代碼 代碼如下:let somePoint = (1, 1)switch somePoint case (0, 0):println("(0, 0) is at the origin&qu

38、ot;)case (_, 0):println("(somePoint.0), 0) is on the x-axis")case (0, _):println("(0, (somePoint.1) is on the y-axis")case (-2.2, -2.2):println("(somePoint.0), (somePoint.1) is inside the box")default:println("(somePoint.0), (somePoint.1) is outside of the box"

39、;)/ prints "(1, 1) is inside the box"Switch語句決定了點是否在原點(0,0)上,在紅色的x軸上,在橙色的y軸上,在藍(lán)色4X4的矩形為中心的原點內(nèi),或者在矩形外。與C語言不同,Swift允許多個switch的case考慮相同的值。實際上點(0,0)能匹配例子中所有的四個case。然而,如果多個匹配出現(xiàn),第一個匹配成功的case將被使用。點(0,0)能首先匹配case(0,0),所以其他所有的case將被忽略。Value Bindings 值綁定一個switch的case能綁定用于匹配臨時常量或變量值,在case的分支代碼里使用。這就是

40、value binding(值綁定),因為這些值在case的代碼體中是臨時常量或變量的“邊界”。下面的例子有一個點(x,y),用元組型(Int,Int)來表示,在圖種展示出來如下:復(fù)制代碼 代碼如下:let anotherPoint = (2, 0)switch anotherPoint case (let x, 0):println("on the x-axis with an x value of (x)")case (0, let y):println("on the y-axis with a y value of (y)")case let (

41、x, y):println("somewhere else at (x), (y)")/ prints "on the x-axis with an x value of 2switch語句來確定點是否在紅色x軸上,在橙色y軸,或者其他地方。三個switch的case都聲明了占位常量x和y,暫時從anotherPoint占用一個或兩個元組值。第一個case里,case (let x, 0),匹配給任意一個y值為0,并分派點的x值給臨時常量x的點。相似地,第二個case,case (0, let y),匹配給一個x值為0,分派點的y值給臨時常量y的點。一旦臨時常量被

42、聲明,他們將在case的代碼塊中使用。這里他們將作為簡寫在println函數(shù)中打印出來。注意switch語句沒有default的case。最后一個case,case let (x, y),聲明了包含兩個占位常量可以匹配任何值的元組。作為結(jié)果,它匹配任何可能的值,不需要default語句switch就足夠完美了。上面的例子中,聲明x和y用了關(guān)鍵詞let,因為這里不需要在case的代碼段里改變它們的值。然而,他們可以用變量來代替,使用var關(guān)鍵詞。如果用了變量,則會創(chuàng)建臨時變量并初始化為合適的值。任何對變量的改變都只會影響case代碼段中的部分。Where語句switch的case能使用where

43、子句來進一步判斷條件。 下面的例子將點(x,y)在下圖種分類:復(fù)制代碼 代碼如下:let yetAnotherPoint = (1, -1)switch yetAnotherPoint case let (x, y) where x = y:println("(x), (y) is on the line x = y")case let (x, y) where x = -y:println("(x), (y) is on the line x = -y")case let (x, y):println("(x), (y) is just so

44、me arbitrary point")/ prints "(1, -1) is on the line x = -y"switch語句判斷了點是否在綠色斜線上且x = y,或在紫色斜線上且x = -y,或都不是。三個switch的case聲明了占位常量x和y,臨時占用point中元組值。這些常量作為where子句的一部分,用來創(chuàng)建動態(tài)的篩選。只有當(dāng)where子句的條件結(jié)果為true,Switch的case則會匹配現(xiàn)有point的值。就像在前一個例子中,最后的case匹配所有可能的值,所以不需要default。Control Transfer Statements

45、 - 控制轉(zhuǎn)移語句控制轉(zhuǎn)移語句能改變已經(jīng)執(zhí)行代碼的順序,能使代碼跳轉(zhuǎn)到別的部分。Swift有四個句子:1.continue2.break3.fallthrough4.returncontrol, break和fallthrough在下文中詳解。reture語句在Functions中描述。ContinueContinue語句告訴循環(huán)體終止現(xiàn)在的操作,然后開始迭代下一個循環(huán)。好像在說“我這次迭代做完啦”,總之不會離開循環(huán)體。復(fù)制代碼 代碼如下:NOTE:在for-condition-increment循環(huán)中,調(diào)用了continue后累加器依舊會計算。循環(huán)會繼續(xù)像平時一樣工作,只有循環(huán)體中的代碼會被

46、跳過。下面例子中從一個小寫字符串中移除了所有的元音和空格,創(chuàng)建了個字謎短語:復(fù)制代碼 代碼如下:let puzzleInput = "great minds think alike"var puzzleOutput = ""for character in puzzleInput switch character case "a", "e", "i", "o", "u", " ":continuedefault:puzzleOutput

47、 += characterprintln(puzzleOutput)/ prints "grtmndsthnklk"上面代碼里,只要匹配到元音字母或空格,就會觸發(fā)continue關(guān)鍵字。使本次迭代立即終止,然后直接跳入下次迭代的開頭。這個方式使得switch代碼塊能匹配(和忽略)元音字母與空格,比用代碼塊把每一個要打印字符都匹配一次的好。BreakBreak語句能立即終止整個控制流??梢愿鶕?jù)你想要的在switch或循環(huán)語句里的任何地方終止整個執(zhí)行。Break in a Loop Statement - 循環(huán)中的Break當(dāng)在循環(huán)體中使用break,循環(huán)會立即停止,并將控制流

48、帶到循環(huán)體括號()后方的第一行代碼里。循環(huán)體里其他的代碼不會被執(zhí)行,也不會開始下一次迭代。Break in a Switch Statement - Switch中的break在switch里使用break,switch語句會立即終止,并將控制流帶到switch語句括號()后方的第一行代碼里。這種特性可以用于switch里匹配(或忽略)一個或多個case。因為Swift的switch是窮舉的,并且不允許有空case的,有時候要慎重的匹配和為了使意圖明顯而忽略了case。當(dāng)switch匹配了break語句,case中的break能直接終止整個switch。復(fù)制代碼 代碼如下:NOTE:一個swi

49、tch的case只能包含一個作為編譯錯誤的注釋。注釋不是語句,不會導(dǎo)致switch的case被忽略。只能使用break語句來跳過case。下面的例子中switch有一個字符值,并且判斷四種語言之一中是否有數(shù)字符號。一個簡單的switch中包含了多個值:復(fù)制代碼 代碼如下:let numberSymbol: Character = "三" / Simplified Chinese for the number 3var possibleIntegerValue: Int?switch numberSymbol case "1", "",

50、 "一", "":possibleIntegerValue = 1case "2", "", "二", "":possibleIntegerValue = 2case "3", "", "三", "":possibleIntegerValue = 3case "4", "", "四", "":possibleInteg

51、erValue = 4default:breakif let integerValue = possibleIntegerValue println("The integer value of (numberSymbol) is (integerValue).") else println("An integer value could not be found for (numberSymbol).")/ prints "The integer value of 三 is 3."例子中通過檢查numberSymbol判斷是否是拉丁語

52、,阿拉伯語,中文或者泰文符號來得到1至4的數(shù)字。如果匹配成功,其中的一個case里會賦給可選型Int變量possibleIntegerValue一個合適的整型值。在switch語句執(zhí)行完成后,例子里用了可選型綁定來確定值是否被發(fā)現(xiàn)。possibleIntegerValue變量有一個隱性的初始值nil,具有可選型的優(yōu)點。只有在前四個case中,當(dāng)possibleIntegerValue被賦了實際的值可選綁定才會成功。在上面例子中列出所有可能的字符值不太實際,所以default能提供一個沒任何字符被選中情況下的容器。這的default不用執(zhí)行任何操作,只寫個簡單的break。一旦default被匹

53、配,break語句立即終止switch,并繼續(xù)執(zhí)行 if let語句。FallthroughSwift中的Switch不會掉下到case的下方并進入下一個case。因此,整個switch語句毀在第一個匹配的case完成后結(jié)束。相反,C語言要求你在每個case的末尾插入一個break來防止掉入。相比于C語言,Swift的switch禁止默認(rèn)掉入讓更加簡潔和可控,這樣避免了執(zhí)行多個case的錯誤。如果你確實需要C式的掉入特性,你可以使用fallthrough關(guān)鍵詞。下面的例子用fallthrough來創(chuàng)建一段描述數(shù)字的文本:復(fù)制代碼 代碼如下:let integerToDescribe = 5va

54、r description = "The number (integerToDescribe) is"switch integerToDescribe case 2, 3, 5, 7, 11, 13, 17, 19:description += " a prime number, and also"fallthroughdefault:description += " an integer."println(description)/ prints "The number 5 is a prime number, and a

55、lso an integer."例子中聲明了一個名為description的String型變量并分派一個初始值。然后函數(shù)用switch匹配integerToDescribe的值。如果integerToDescribe的值符合素數(shù)列表中的一項,最后的description會增加一段字符,注意數(shù)字都是素數(shù)。然后用fallthrough關(guān)鍵字讓代碼“掉到”default里。default的代碼中再額外的給字符串添加些描述,最后switch結(jié)束。如果integerToDescribe不跟素數(shù)表中任何一項匹配,那根本就不會匹配switch的第一個case。這里面沒有其他的case,因此integerToDescribe直接進入default容器。在switch執(zhí)行完成后,數(shù)字的描述用println函數(shù)打印出來。在本例中,5是正確的答案。復(fù)制代碼 代碼如下:NOTE:fallthrough關(guān)鍵字不檢查case里的條件,會直接掉入下一個case。fallthrough簡單的讓代碼執(zhí)行到下一個case(或default)的代碼塊中,和標(biāo)準(zhǔn)C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論