For 循環(huán)
for
循環(huán)按照指定的次數(shù)的循環(huán)執(zhí)行一段代碼。Swift 提供了兩種for
循環(huán):
-
for-in
遍歷范圍,序列,集合中的每個(gè)元素,并執(zhí)行一段代碼 -
for-condition-increment
將循環(huán)執(zhí)行一段代碼,直到滿足了某些條件。
For-In
我們用for-in
循環(huán)遍歷一個(gè)集合中的元素,例如遍歷區(qū)間中的數(shù),遍歷數(shù)組中的元素,以及字符串中的字符。
首先我們遍歷一下區(qū)間中的每個(gè)數(shù)字:
for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
這段代碼會(huì)輸出:
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
我們遍歷的是一個(gè)從1到5的閉區(qū)間。首先index
被賦值為1
,然后執(zhí)行了println
這行代碼,我們得到了這行代碼的輸出1 times 5 is 5
;這時(shí)循環(huán)開(kāi)始了,index
被賦值為區(qū)間中的第二個(gè)元素2
,然后繼續(xù)上面的操作,執(zhí)行代碼段并進(jìn)行循環(huán);直到index
被賦值為區(qū)間的最后一個(gè)元素5
,并執(zhí)行完println
,此時(shí)區(qū)間中已經(jīng)沒(méi)有更多的元素了,for-in
循環(huán)便完成了。
在這個(gè)例子中,index
在每次循環(huán)開(kāi)始時(shí)被隱式聲明為一個(gè)常量,不需要let
限定符,作用域僅在for-in
循環(huán)的代碼區(qū)域中。
如果我們遍歷時(shí),不需要元素的值,只關(guān)心循環(huán)幾次,可以用下劃線替代上面例子中index
的位置:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
println("\(base) to the power of \(power) is \(answer)")
在這個(gè)例子中,我們計(jì)算了3的十次方。我們需要10個(gè)三連續(xù)相乘,只關(guān)心循環(huán)了10次,所以用下劃線替代了上例中index
的位置。
下面我們用for-in
來(lái)循環(huán)遍歷一個(gè)數(shù)組:
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
println("Hello, \(name)!")
}
這段代碼會(huì)輸出:
Anna
Alex
Brian
Jack
同樣的,還可以通過(guò)for-in
循環(huán)遍歷一個(gè)字典,訪問(wèn)字典的每個(gè)元素及其對(duì)應(yīng)的關(guān)鍵字。我們創(chuàng)建一個(gè)名為numberOfLegs
的字典對(duì)象,顧名思義,這個(gè)對(duì)象映射了每種動(dòng)物有幾條腿:
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
println("The \(animalName) has \(legCount) legs")
}
這段代碼會(huì)輸出:
The spider has 8 legs
The ant has 6 legs
The cat has 4 legs
訪問(wèn)字典元素的順序與插入順序可能會(huì)不一樣,因?yàn)樽值渲械脑厥菬o(wú)序的;如果我們需要的是有序的集合,那應(yīng)該選用數(shù)組來(lái)存儲(chǔ)他們。
下面我們來(lái)用for-in
遍歷一個(gè)字符串中的每個(gè)字符:
for character in "Hello" {
println(character)
}
我們會(huì)得到這樣的輸出:
H
e
l
l
o
C 形式的 For 循環(huán)
除了for-in
之外,Swift 還提供了 C 形式的 for
循環(huán)。C 形式的 for
循環(huán)需要一個(gè)初始語(yǔ)句,條件語(yǔ)句,一個(gè)增量語(yǔ)句。
for var index = 0; index < 3; ++index {
println("index is \(index)")
}
這段代碼會(huì)輸出:
index is 0
index is 1
index is 3
這種循環(huán)的標(biāo)準(zhǔn)格式如下:
for 初始語(yǔ)句; 條件語(yǔ)句; 增量語(yǔ)句 {
}
熟悉 C 的讀者會(huì)發(fā)現(xiàn)久違的分號(hào),這種for
循環(huán)和 C 中的非常相似,但是并不需要小括號(hào)來(lái)把語(yǔ)句部分包裹起來(lái)。for
循環(huán)按照下面的流程執(zhí)行:
- 當(dāng)循環(huán)開(kāi)始時(shí),首先執(zhí)行了
初始語(yǔ)句
,該語(yǔ)句只執(zhí)行一遍,就是在循環(huán)開(kāi)始時(shí)。 - 現(xiàn)在執(zhí)行
條件語(yǔ)句
。條件語(yǔ)句
必須返回布爾類型。如果該條件語(yǔ)句
的運(yùn)行結(jié)果是true
,那么會(huì)繼續(xù)執(zhí)行第3步。 - 程序會(huì)進(jìn)入
for
循環(huán)的代碼區(qū)域,按順序執(zhí)行每行代碼。當(dāng)執(zhí)行完全部的代碼之后,將執(zhí)行增量語(yǔ)句
,緊接著返回第2步。
一般來(lái)說(shuō),for
循環(huán)的初始語(yǔ)句
會(huì)聲明一個(gè)變量,條件語(yǔ)句
會(huì)根據(jù)這個(gè)變量進(jìn)行一些判斷,增量語(yǔ)句
會(huì)修改這個(gè)變量。
我們用while
循環(huán)來(lái)說(shuō)明一下for
循環(huán)的執(zhí)行過(guò)程:
初始語(yǔ)句
while 條件語(yǔ)句 {
代碼區(qū)域
增量語(yǔ)句
}
與while
循環(huán)不同的是,for
循環(huán)中,如果在初始語(yǔ)句中聲明一個(gè)變量,那么該變量的作用域僅僅是for
循環(huán)的條件語(yǔ)句
、增量語(yǔ)句
以及代碼區(qū)域中。
如果在for
循環(huán)結(jié)束后,還需要這個(gè)變量的值,那么我們要在for
循環(huán)外聲明該變量:
var index: Int
loop: for index = 0; index < 5; ++index {
var sqr = index * index
if sqr == 9 {
break loop
}
}
println(index)
這段代碼輸出:
3
這段代碼從[0, 5)這個(gè)區(qū)間尋找平方數(shù)為9的數(shù)字,我們都知道這是3。
var index: Int=0
for ; index < 3; ++index {
// do nothing, just loop
}
println(index)
這段代碼輸出:
3
上面這段代碼展示了for
循環(huán)的初始語(yǔ)句
可以為空,同理,條件語(yǔ)句
和增量語(yǔ)句
都可以是空語(yǔ)句。