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
{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
,並終止循環。