位置:首頁 > 高級語言 > Swift教學 > Swift For循環

Swift For循環

For 循環

for循環用來按照指定的次數多次執行一係列語句。Swift 提供兩種for循環形式:

  • for-in用來遍曆一個區間(range),序列(sequence),集合(collection),係列(progression)裡麵所有的元素執行一係列語句。
  • for條件遞增(for-condition-increment)語句,用來重複執行一係列語句直到達成特定條件達成,一般通過在每次循環完成後增加計數器的值來實現。

For-In

你可以使用for-in循環來遍曆一個集合裡麵的所有元素,例如由數字表示的區間、數組中的元素、字符串中的字符。

下麵的例子用來輸出乘 5 乘法表前麵一部分內容:

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

例子中用來進行遍曆的元素是一組使用閉區間操作符(...)表示的從15的數字。index被賦值為閉區間中的第一個數字(1),然後循環中的語句被執行一次。在本例中,這個循環隻包含一個語句,用來輸出當前index值所對應的乘 5 乘法表結果。該語句執行後,index的值被更新為閉區間中的第二個數字(2),之後println方法會再執行一次。整個過程會進行到閉區間結尾為止。

上麵的例子中,index是一個每次循環遍曆開始時被自動賦值的常量。這種情況下,index在使用前不需要聲明,隻需要將它包含在循環的聲明中,就可以對其進行隱式聲明,而無需使用let關鍵字聲明。


注意:
index常量隻存在於循環的生命周期裡。如果你想在循環完成後訪問index的值,又或者想讓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)")
// 輸出 "3 to the power of 10 is 59049"

這個例子計算 base 這個數的 power 次冪(本例中,是310次冪),從1(30次冪)開始做3的乘法, 進行10次,使用110的閉區間循環。這個計算並不需要知道每一次循環中計數器具體的值,隻需要執行了正確的循環次數即可。下劃線符號_(替代循環中的變量)能夠忽略具體的值,並且不提供循環遍曆時對值的訪問。

使用for-in遍曆一個數組所有元素:

let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
    println("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!

你也可以通過遍曆一個字典來訪問它的鍵值對(key-value pairs)。遍曆字典時,字典的每項元素會以(key, value)元組的形式返回,你可以在for-in循環中使用顯式的常量名稱來解讀(key, value)元組。下麵的例子中,字典的鍵(key)解讀為常量animalName,字典的值會被解讀為常量legCount

let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
    println("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs

字典元素的遍曆順序和插入順序可能不同,字典的內容在內部是無序的,所以遍曆元素時不能保證順序。關於數組和字典,詳情參見集合類型

除了數組和字典,你也可以使用for-in循環來遍曆字符串中的字符(Character):

for character in "Hello" {
    println(character)
}
// H
// e
// l
// l
// o

For條件遞增(for-condition-increment)

除了for-in循環,Swift 提供使用條件判斷和遞增方法的標準 C 樣式for循環:

for var index = 0; index < 3; ++index {
    println("index is \(index)")
}
// index is 0
// index is 1
// index is 2

下麵是一般情況下這種循環方式的格式:

for initializationconditionincrement {
statements
}

和 C 語言中一樣,分號將循環的定義分為 3 個部分,不同的是,Swift 不需要使用圓括號將“initialization; condition; increment”包括起來。

這個循環執行流程如下:

  1. 循環首次啟動時,初始化表達式(initialization expression)被調用一次,用來初始化循環所需的所有常量和變量。
  2. 條件表達式(condition expression)被調用,如果表達式調用結果為false,循環結束,繼續執行for循環關閉大括號 (})之後的代碼。如果表達式調用結果為true,則會執行大括號內部的代碼(statements)。
  3. 執行所有語句(statements)之後,執行遞增表達式(increment expression)。通常會增加或減少計數器的值,或者根據語句(statements)輸出來修改某一個初始化的變量。當遞增表達式運行完成後,重複執行第 2 步,條件表達式會再次執行。

上述描述和循環格式等同於:

initialization
while condition {
statements
increment
}

在初始化表達式中聲明的常量和變量(比如var index = 0)隻在for循環的生命周期裡有效。如果想在循環結束後訪問index的值,你必須要在循環生命周期開始前聲明index

var index: Int
for index = 0; index < 3; ++index {
    println("index is \(index)")
}
// index is 0
// index is 1
// index is 2
println("The loop statements were executed \(index) times")
// 輸出 "The loop statements were executed 3 times

注意index在循環結束後最終的值是3而不是2。最後一次調用遞增表達式++index會將index設置為3,從而導致index < 3條件為false,並終止循環。