原文: https://www.programiz.com/swift-programming/for-in-loop

在本文中,您将了解for-in循环,其用例和变体。

For-in循环用于运行一组任务一定次数。 这些循环遍历任何序列,例如数组中的项目,范围或字符串中的字符。

我们还使用for-in循环在固定的时间内执行一些重复的过程。


为什么需要for in循环?

想象有人告诉您编写一个输出"Hello, World!"的程序! 在屏幕上。 您的解决方案将是:

  1. print("Hello, World!")

如果他们改变主意并告诉您编写一个在屏幕上显示五次"Hello, World!"的程序,该怎么办? 如果没有循环知识,您的解决方案可能是:

  1. print("Hello, World!")
  2. print("Hello, World!")
  3. print("Hello, World!")
  4. print("Hello, World!")
  5. print("Hello, World!")

嗯,完成五次相似的代码来完成相同的工作看起来很耗时。 如果是这样,如果有人要求您编写一个在屏幕上输出数百甚至上百万次"Hello, World!"的程序,您将怎么办?

一种幼稚的解决方案是将print语句写入给定的次数。 听起来很疯狂吧? 但是,使用for-in循环和以下几行代码可以找到更好的解决方案:

  1. for i in 1...100 {
  2. //outputs Hello world for 100 times in the screen
  3. print("Hello, World!")
  4. }

不用担心语法,我们将在下面进行探讨。


for in循环语法

您可以在 Swift 中创建一个for in循环,如下所示:

  1. for <value> in <range> {
  2. <some work here>
  3. }

上面的循环遍历一个范围,我们可以在<value>变量中访问从该范围返回的每个元素。 如果您不了解范围,则可以查看以下文章: Swift 范围


它是如何工作的?

  • 被迭代的序列是<range>
  • <value>设置为该范围内的第一个数字,并且执行循环内部的语句
  • 执行该语句后,<value>被更新为<range>语句包含的第二个值,<some work here>再次被执行。
  • 该过程一直持续到到达范围的终点并停止循环。

示例 1:for-in循环在 Swift 中的工作方式

  1. for i in 1...3 {
  2. print("Hello world!. Value is \(i)")
  3. }

运行该程序时,输出为:

  1. Hello world!. Value is 1
  2. Hello world!. Value is 2
  3. Hello world!. Value is 3

在上面的程序中,要迭代的序列的范围是 1 到 3。

i的值设置为范围(1)中的第一个数字,并在每次迭代时更新为范围的下一个数字。 此过程一直持续到到达范围(3)的末尾。

For-in循环执行步骤

迭代 从范围(i)返回的值 输出
1 1 Hello world!. Value is 1
2 2 Hello world!. Value is 2
3 3 Hello world!. Value is 3

for-in循环中舍弃范围值

如果循环内没有使用范围值,则可以在 Swift 中使用_(下划线)将其丢弃,如下所示:

  1. for _ in <range> {
  2. <some work here>
  3. }

示例 2:在for-in循环中丢弃范围值

  1. // This example neglects value and uses half open range operator
  2. for _ in 1..<3 {
  3. print("Hello world!")
  4. }

运行该程序时,输出为:

  1. Hello world!
  2. Hello world!

在上面的程序中,由于使用了半开范围运算符..<),该序列的迭代范围是 1 到 2,但不包括下界(1)上限(3)。

_忽略范围(1)中的值,并执行打印语句。 再次调用print语句进行下一次迭代,并且过程结束,因为 2 是该范围内的最后一个值。

没有范围值的for-in循环执行步骤

迭代 范围返回的值 输出
1 舍弃 Hello world!
2 舍弃 Hello world!

for-in循环,使用步幅固定的间隔

如果要使循环在每次迭代中以某个固定值(而不是范围)递增,则必须使用stride方法。

示例 3:使用步幅的for-in循环

  1. let interval = 2
  2. for i in stride(from: 1, to: 10, by: interval) {
  3. print(i)
  4. }

运行该程序时,输出为:

  1. 1
  2. 3
  3. 5
  4. 7
  5. 9

在上述程序中,stride函数返回数字序列:1、3、5、7、9。

i的值设置为序列(1)的第一个数字,并执行循环内的print语句,该语句在控制台中输出“1”。

执行该语句后,i的值将更新为另一个值(3),并再次调用print语句。 该过程一直持续到访问序列中的所有元素为止。

使用步长的for-in循环执行步骤

条件(i < end i(输出)
1 1 < 10(是) 1
1 + 2 = 3 3 < 10(是) 3
1 + 2 * 2 = 5 5 < 10(是) 5
1 + 3 * 2 = 7 7 < 10(是) 7
1 + 4 * 2 = 9 9 < 10(是) 9
1 + 5 * 2 = 11 11 < 10(否) 停止

如何使用for-in循环访问集合的元素?

假设您有一个字符串数组,如下所示。 如果您不了解数组,可以将数组视为可以存储多个值的单个容器。 有关更多详细说明,请参见 Swift 数组

  1. let programmingLanguages = ["Swift", "Java", "Go","JavaScript","Kotlin","Python"]

如果有人告诉您打印所有编程语言怎么办?

一种方法是使用索引作为programmingLanguages[0], programmingLanguages[1] …来访问这些元素,依此类推,直到获得所有元素。 但这太繁琐了。

这是抢救循环。 您可以使用for in循环进行迭代:

示例 4:使用for-in循环访问数组(集合)的元素

  1. let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"]
  2. for language in programmingLanguages {
  3. print(language)
  4. }

运行该程序时,输出为:

  1. Swift
  2. Java
  3. Go
  4. JavaScript
  5. Kotlin
  6. Python

在上面的程序中,要迭代的序列是一个字符串数组。

language的值设置为数组的第一个元素,并执行循环内的print语句,该语句在控制台中输出Swift

执行该语句后,将使用数组的下一个元素更新language,并再次调用print语句。 这个过程一直持续到访问数组的最后一个元素为止。


示例 5:使用 for-in 循环访问字符串(集合)的元素

由于在 Swift 中字符串也是集合,因此您可以使用for循环访问字符串中的每个字符。

  1. for value in "I♥Swift!" {
  2. print(value)
  3. }

运行该程序时,输出为:

  1. I
  2. S
  3. w
  4. i
  5. f
  6. t
  7. !

如何使用for-in循环访问集合的索引?

如果要访问数组的索引(数组中元素的位置,即 0、1、2),则需要使用enumerated方法:

示例 6:使用for-in循环访问数组的索引

  1. let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"]
  2. for (index, language) in programmingLanguages.enumerated() {
  3. print("\(index):\(language)")
  4. }

运行该程序时,输出为:

  1. 0:Swift
  2. 1:Java
  3. 2:Go
  4. 3:JavaScript
  5. 4:Kotlin
  6. 5:Python

在这里,枚举方法返回数组(Int)和值(String)组成的元组(IntString)。 例如:(0, Swift)(1, Java)

使用for-in循环,可以在元组中一对一地访问这些项目。 如果您不了解元组,则可以简单地将其视为可以容纳不同类型值的容器。 有关更多详细说明,请参见 Swift 元组


如何在for-in循环中使用where子句过滤元素?

您也可以使用for-in循环和where子句过滤内容:

  1. for value in "I♥Swift!" where value != "!" {
  2. print(value) //removes exclamation sign
  3. }

运行该程序时,输出为:

  1. I
  2. S
  3. w
  4. i
  5. f
  6. t

在上面的程序中,要迭代的序列是字符串(字符集合)。

value设置为字符串的第一个字符,并使用where条件进行检查。 如果条件返回true,则执行循环内的块(打印语句),并在控制台中输出"I"

执行该语句后,value更新为字符串的下一个字符,并再次检查条件。 如果条件返回false,则不执行该块,并且value更新为下一个字符。

此过程一直持续到访问字符串的最后一个字符为止。

带有过滤的for-in循环执行步骤

迭代 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