7.1 For 循環(huán)

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í)行:

  1. 當(dāng)循環(huán)開(kāi)始時(shí),首先執(zhí)行了初始語(yǔ)句,該語(yǔ)句只執(zhí)行一遍,就是在循環(huán)開(kāi)始時(shí)。
  2. 現(xiàn)在執(zhí)行條件語(yǔ)句條件語(yǔ)句必須返回布爾類型。如果該條件語(yǔ)句的運(yùn)行結(jié)果是true,那么會(huì)繼續(xù)執(zhí)行第3步。
  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ǔ)句。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容