Swift的控制流和其他語言區(qū)別不大查乒。只有switch的細(xì)節(jié)稍微多一些敦锌,更強大一些您机。讀者應(yīng)多加注意。
1. For 循環(huán)
For循環(huán)有兩種寫法脖祈。第一種和C基本一樣(除了括號可以省去)损拢。
-
第一種的寫法是: 變量初始化;終止條件:變量增加的步長。 例如:
for var i = 0; i<2; i = i+1 { println(i) //playground里面輸出0,1 }
語法解析的過程為:i首先被初始化為0撒犀。每一次執(zhí)行循環(huán)體之前福压,檢查是否滿足條件i<2,如果是,那么執(zhí)行或舞。如果否荆姆,那么終止。每次循環(huán)體執(zhí)行結(jié)束后映凳,i 的值加1胆筒。
- 第二種寫法是: for 常量 in 有序集合。例如:
var str = "abc"
var reverseStr = ""
for ii in str {
println(ii)
reverseStr = String(ii) + reverseStr
println(reverseStr)
}
//最后reverStr為"cba",也就是求出了string的逆序排列诈豌。
for in Loops也可以遍歷字典來做循環(huán)仆救。因為字典包含的項比較復(fù)雜,所以要特別小心檢查循環(huán)條件和循環(huán)體矫渔。另外注意字典被循環(huán)的時候彤蔽,遍歷順序是隨機的。這是因為字典不以位置來檢索庙洼,所以并不是先按第一個位置來進(jìn)行這樣子顿痪。
2. While循環(huán)同樣有兩種
- 純while循環(huán)的語法如下:
while 某判斷條件
{
做一些事情
}
就是當(dāng)條件滿足是,不停的執(zhí)行循環(huán)體油够。每次執(zhí)行完蚁袭,再檢查是否滿足。例如:
var i = 1
while i<5
{
println(i)
i++
} 輸出為1 2 3 4
*do while循環(huán)
do while循環(huán)先做do后面的循環(huán)體石咬,然后判斷條件是否滿足揩悄。所以do while循環(huán),至少執(zhí)行一遍循環(huán)體鬼悠。無論條件是否滿足删性。
var i = 1
do
{
println(i)
i++
} while i < -1 //輸出為1棉饶。
3. continue和break
你可以在循環(huán)體內(nèi)任何地方使用continue。其作用是終止當(dāng)前的循環(huán)體執(zhí)行镇匀,開始下一次循環(huán)。for語句前面可以加標(biāo)簽袜啃。continue后面可以跟隨標(biāo)簽汗侵,就像GoTo語句一樣,直接跳到被標(biāo)簽的語句處群发。
你可以在循環(huán)體內(nèi)任何地方使用break晰韵。其作用是直接去執(zhí)行循環(huán)后的下一個語句。也就是完全跳出了循環(huán)熟妓。
4. if-else
if-else的最基本的寫法為:
if 條件 {做些事情}
else {做些事情}
注意大括號不能省略雪猪。另外else if也是支持的。如下例:
var i = 1
if i == 1 {println("三年又三年");
i = i+1 }
else {println("大家吃雞蛋")}
//注意雖然i后來等于2了起愈,但是"大家吃雞蛋不會被執(zhí)行"只恨。因為前面判斷的時候i == 1
5. case switch
-
switch case的寫法和C非常相似。但有兩點關(guān)鍵不同抬虽。
(1)我們不需要在每個case里面放break官觅。默認(rèn)情況完成case后面的執(zhí)行語句后,自動跳出阐污。(2)fallthrough關(guān)鍵字可以讓一個case后面的另一個case里的執(zhí)行句被執(zhí)行休涤。 另外,case必須窮舉一切可能笛辟,不然就必須寫default功氨。下面例子清楚的說明了這些特點:var i = 1
switch i
{
case 1:
println(i)
fallthrough
case 2:
println("好")
default:
println(2)
}
//輸出為: 1 好
上面執(zhí)行過程是這樣的:因為i==1, 所以第一個println被執(zhí)行。因為有fallthrough,所以第二個println被執(zhí)行手幢。第三個println不會被執(zhí)行捷凄。
-
switch/case支持使用tuple。在case判斷句里面围来,可以使用"_"表示此元素?zé)o論是什么都匹配纵势。還可以用var和let定義一個名字,表示此元素?zé)o論是什么都匹配管钳,而這個變量或者常量就是此元素的一個內(nèi)部復(fù)制钦铁。如下例:
var T = (9,"九", "nine")
switch T
{
case (_,let a,"nine") :
println(a)
default:
println()
} //輸出為 "九"
以上語句執(zhí)行過程為:case后面的tuple, _表示第一個元素是什么都行。所以T匹配這個元素才漆。let a, 第二個元素表示第二個元素是什么都可以牛曹,所以也匹配。同時第二個元素被復(fù)制到a里面醇滥。第三個元素一定要是"nine"黎比,檢查發(fā)現(xiàn)也匹配超营。所以去執(zhí)行println(a)。
-
Switch/Case里面可以用where:
var T = (9,"九", "nine") switch T { case (_,let a,let b) where b.hasPrefix("n") : println("\(a)") default: println() }
上述語句輸出同樣為"九"阅虫。第三個條件解釋為:必須前綴是"n" 才匹配演闭。
最后,switch/case可以在聚合體上使用颓帝。我們將在下一章講解聚合體時候解釋米碰。