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
例子中用來進行遍歷的元素是一組使用閉區間操作符(...)表示的從1到5的數字。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 次冪(本例中,是3的10次冪),從1(3的0次冪)開始做3的乘法, 進行10次,使用1到10的閉區間循環。這個計算並不需要知道每一次循環中計數器具體的值,只需要執行了正確的循環次數即可。下劃線符號_(替代循環中的變量)能夠忽略具體的值,並且不提供循環遍歷時對值的訪問。
使用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
initialization;condition;increment{statements
}
和 C 語言中一樣,分號將循環的定義分爲 3 個部分,不同的是,Swift 不需要使用圓括號將「initialization; condition; increment」包括起來。
這個循環執行流程如下:
- 循環首次啓動時,初始化表達式(initialization expression)被調用一次,用來初始化循環所需的所有常量和變量。
- 條件表達式(condition expression)被調用,如果表達式調用結果爲
false,循環結束,繼續執行for循環關閉大括號 (})之後的代碼。如果表達式調用結果爲true,則會執行大括號內部的代碼(statements)。 - 執行所有語句(statements)之後,執行遞增表達式(increment expression)。通常會增加或減少計數器的值,或者根據語句(statements)輸出來修改某一個初始化的變量。當遞增表達式運行完成後,重複執行第 2 步,條件表達式會再次執行。
上述描述和循環格式等同於:
initialization
whilecondition{statementsincrement
}
在初始化表達式中聲明的常量和變量(比如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,並終止循環。