在本文中,您將了解for-in循環(huán),其使用示例和變體。
for-in 循環(huán)用于在一定時間內(nèi)運行一組任務(wù)。這些循環(huán)遍歷任何序列,例如數(shù)組中的項、范圍或字符串中的字符。
我們還使用for-in循環(huán)在固定的時間內(nèi)執(zhí)行一些重復(fù)的過程。
想象一下,有人告訴您要編寫一個在屏幕上,輸出Hello,World的程序! 您的解決方案將是:
print("Hello, World!")
如果他們改變主意并告訴您編寫一個在屏幕上輸出Hello,World顯示五次的程序,該怎么辦?。如果沒有循環(huán)知識,您的解決方案可能是:
print("Hello, World!") print("Hello, World!") print("Hello, World!") print("Hello, World!") print("Hello, World!")
嗯 ,完成五次相似的代碼來完成相同的工作看起來很耗時。如果是這樣,如果有人要求您編寫一個輸出Hello,World!的程序,在屏幕上數(shù)百甚至上百萬次?您將怎么辦?
一種幼稚的解決方案是編寫print給定次數(shù)的語句。聽起來很瘋狂吧?但是,通過使用for-in循環(huán)的幾行代碼,可以找到更好的解決方案:
for i in 1...100 { //在屏幕上輸出Hello World 100次 print("Hello, World!") }
不用擔心語法,我們將在下面進行探討。
您可以在Swift中創(chuàng)建for in循環(huán),如下所示:
for <value> in <range> { <some work here> }
上面的循環(huán)遍歷一個范圍,我們可以在<value>變量中訪問從該范圍返回的每個元素。 如果您不了解范圍,可以查看以下文章:Swift Ranges。
被迭代的序列是一個<range>。
將 <value> 設(shè)置為范圍內(nèi)的第一個數(shù)字,并執(zhí)行循環(huán)內(nèi)的語句 < 此處的某些工作 >
語句執(zhí)行后,<value>被更新為包含<range>中的第二個值,并且語句 <此處的某些工作> 再次被執(zhí)行。
該過程一直持續(xù)到到達范圍的終點并停止循環(huán)。
for i in 1...3 { print("Hello world!. Value is \(i)") }
運行該程序時,輸出為:
Hello world!. Value is 1 Hello world!. Value is 2 Hello world!. Value is 3
在上面的程序中,要迭代的序列的范圍是1到3。
i 的值設(shè)置為范圍(1)中的第一個數(shù)字,并在每次迭代中更新為范圍的下一個數(shù)字。這個過程一直持續(xù)到范圍(3)的結(jié)束。
迭代 | 從范圍(i)返回的值 | 輸出 |
---|---|---|
1 | 1 | Hello world!. Value is 1 |
2 | 2 | Hello world!. Value is 2 |
3 | 3 | Hello world!. Value is 3 |
如果循環(huán)內(nèi)沒有使用范圍值,則可以在Swift中使用(下劃線 _)丟棄,如下所示:
for _ in <range> { <some work here> }
//本示例忽略值并使用半開范圍運算符 for _ in 1..<3 { print("Hello world!") }
運行該程序時,輸出為:
Hello world! Hello world!
在上面的程序中,由于使用半開范圍運算符(.. <),所以要遍歷的序列的范圍是1到2,其中包括下限(1)但不包括上限(3)。
下劃線 _ 忽略范圍(1)中的值,并執(zhí)行print語句。 再次調(diào)用print語句進行下一次迭代,并且過程結(jié)束,因為2是該范圍內(nèi)的最后一個值。
迭代 | 從范圍返回的值 | 輸出 |
---|---|---|
1 | 丟棄 | Hello world! |
2 | 丟棄 | Hello world! |
如果要使循環(huán)在每次迭代中以某個固定值(而不是范圍)遞增,則必須使用stride方法。
let interval = 2 for i in stride(from: 1, to: 10, by: interval) { print(i) }
運行該程序時,輸出為:
1 3 5 7 9
在上面的程序中,該stride函數(shù)返回數(shù)字序列:1、3、5、7、9。
i的值設(shè)置為序列(1)的第一個數(shù)字,并執(zhí)行循環(huán)內(nèi)的print語句,該語句在控制臺中輸出“ 1”。
執(zhí)行該語句后,將i的值更新為另一個值(3),并再次調(diào)用print語句。該過程一直持續(xù)到訪問序列中的所有元素為止。
值 | 條件(Value < End) | i (輸出) |
---|---|---|
1 | 1 < 10 (true) | 1 |
1 + 2 = 3 | 3 < 10 (true) | 3 |
1 + 2 * 2 = 5 | 5 < 10 (true) | 5 |
1 + 3 * 2 = 7 | 7 < 10 (true) | 7 |
1 + 4 * 2 = 9 | 9 < 10 (true) | 9 |
1 + 5 * 2 = 11 | 11 < 10 (false) | Stops |
假設(shè)您有一個字符串數(shù)組,如下所示。如果您不了解數(shù)組,可以將數(shù)組視為可以存儲多個值的單個容器。有關(guān)更多詳細說明,請參見Swift 數(shù)組。
let programmingLanguages = ["Swift", "Java", "Go","JavaScript","Kotlin","Python"]
如果有人告訴您打印所有編程語言該怎么辦?
一種方法是使用索引值 programmingLanguages[0], programmingLanguages[1]... 來訪問這些元素,依此類推,直到獲得所有元素。但這太繁瑣了。
所以循環(huán)派上用場了。您可以使用for in循環(huán)進行迭代:
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"] for language in programmingLanguages { print(language) }
運行該程序時,輸出為:
Swift Java Go JavaScript Kotlin Python
在上面的程序中,要迭代的序列是一個字符串數(shù)組。
language 的值設(shè)置為數(shù)組的第一個元素,并執(zhí)行循環(huán)內(nèi)的print語句,該語句在控制臺中輸出“ Swift”。
語句執(zhí)行后,language 將使用數(shù)組的下一個元素進行更新,并再次調(diào)用print語句。這個過程一直持續(xù)到訪問數(shù)組的最后一個元素為止。
由于在Swift中字符串也是集合,因此您可以使用for循環(huán)訪問字符串中的每個字符。
for value in "I?Swift!" { print(value) }
運行該程序時,輸出為:
I ? S w i f t !
如果要訪問數(shù)組的索引(數(shù)組中元素的位置,即0、1、2),則需要使用 enumerated 方法:
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"] for (index, language) in programmingLanguages.enumerated() { print("\(index):\(language)") }
運行該程序時,輸出為:
0:Swift 1:Java 2:Go 3:JavaScript 4:Kotlin 5:Python
在此,枚舉方法返回數(shù)組中每個項目的由索引(Int)和值(String)組成的元組(Int, String)。例如:(0,Swift),(1,Java)
使用 for-in 循環(huán),您可以逐個訪問元組中的這些項。如果您不知道 Tuple(元組),那么您可以簡單地將它看作一個容器,它可以容納不同類型的值。
您還可以使用where子句將for循環(huán)中的內(nèi)容過濾掉
for value in "I?Swift!" where value != "!" { print(value) //刪除感嘆號 }
運行該程序時,輸出為:
I ? S w i f t
在上面的程序中,要迭代的序列是字符串(字符集合)。
value 設(shè)置為字符串的第一個字符,并使用where條件進行檢查。如果條件返回true,則執(zhí)行循環(huán)內(nèi)的塊(打印語句),該塊在控制定臺中輸出“ I”。
語句執(zhí)行后,value 將更新為字符串的下一個字符,然后再次檢查條件。如果條件返回 false,則不執(zhí)行該塊,value 并更新為下一個字符。
該過程一直持續(xù)到訪問字符串的最后一個字符為止。
迭代 | value | value != “!” | 輸出 |
---|---|---|---|
1 | I | true | I |
2 | ? | true | ? |
3 | S | true | S |
4 | w | true | w |
5 | i | true | i |
6 | f | true | f |
7 | t | true | t |
8 | ! | false |