📜  Swift for-in循环

📅  最后修改于: 2020-10-09 15:49:11             🧑  作者: Mango

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

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

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


为什么需要循环循环?

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

print("Hello, World!")

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

print("Hello, World!")
print("Hello, World!")
print("Hello, World!")
print("Hello, World!")
print("Hello, World!")

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

一种幼稚的解决方案是编写给定次数的print语句。听起来很疯狂吧?但是,使用带有少量代码行的for-in循环,有一个更好的解决方案:

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

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


循环内语法

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

for  in  {
    
}

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


怎么运行的?

  • 要迭代的序列是
  • 设置为range中的第一个数字,并执行循环中的语句。
  • 执行该语句后,将更新以使其包含在的第二个值,并再次执行语句
  • 该过程一直持续到到达范围的终点并停止循环。

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

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的值设置为范围(1)中的第一个数字,并在每次迭代时更新为范围的下一个数字。该过程一直持续到到达范围(3)的尽头。

For-in loop execution steps
Iteration Value returned from range (i) Output
1 1 Hello world!. Value is 1
2 2 Hello world!. Value is 2
3 3 Hello world!. Value is 3

在for-in循环中舍弃范围值

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

for _ in  {
    
}

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

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

运行该程序时,输出为:

Hello world!
Hello world!

在上面的程序中,由于使用半开范围运算符 (.. <),所以要遍历的序列的范围是1到2,其中包括下限(1)但不包括上限(3)。

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

For-in loop execution steps without range values
Iteration Value Returned from Range Output
1 Discarded Hello world!
2 Discarded Hello world!

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

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

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

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

运行该程序时,输出为:

1
3
5
7
9

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

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

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

For-in loop execution steps using stride
Value Condition (Value < End) i (Output)
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

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

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

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

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

一种方法是使用index作为programmingLanguages[0], programmingLanguages[1] …等访问这些元素,直到获得所有元素。但这太繁琐了。

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

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

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

运行该程序时,输出为:

Swift
Java
Go
JavaScript
Kotlin
Python

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

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

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


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

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

for value in "I♥Swift!" {
    print(value)
}

运行该程序时,输出为:

I
♥
S
w
i
f
t
!

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

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

示例6:使用for-in循环访问数组的索引
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

在这里,枚举方法返回一个元组( IntString ),该元组由索引( Int )和值( String )组成,用于数组中的每个项目。例如:(0,Swift),(1,Java)…

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


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

您还可以使用where子句将for循环中的内容过滤掉

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

运行该程序时,输出为:

I
♥
S
w
i
f
t

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

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

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

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

Filter using for-in loop execution steps
Iteration value value != “!” Output
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