上一章Swift教程请查看:swift switch条件分支语句
在本文中,你将了解for-in循环、它的用例和变体。
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 {
// 在屏幕中输出Hello world 100次
print("Hello, World!")
}
不要担心语法,我们将在下面讨论它。
For-in循环语法
你可以创建一个for
in循环在swift作为:
for <value> in <range> {
<some work here>
}
上面的循环遍历一个范围,我们可以访问从<value>变量的范围返回的每个元素。
它是如何工作的?
- 遍历的序列是一个<range>。
- <value>被设置为范围内的第一个数字,循环内的语句< some work here >的工作。
- 执行语句之后,将更新<value>以包含<range>中的第二个值,并再次执行语句<some work
here>。 - 此过程将继续,直到到达范围的末尾并停止循环。
例1:for-in循环如何在Swift中工作
for i in 1...3 {
print("Hello world!. Value is \(i)")
}
在上面的程序中,迭代的序列的范围是1到3。
i的值被设置为范围(1)中的第一个数字,并在每次迭代中更新到该范围的下一个数字。这个过程一直持续到范围(3)的末尾。
For-in循环执行步骤
迭代 | 从range(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作为:
for _ in <range> {
<some work here>
}
例2:在for-in循环中丢弃范围值
// 这个例子忽略了值并使用了半开域操作符
for _ in 1..<3 {
print("Hello world!")
}
在上面的程序中,由于使用了半开范围运算符(..<),所以遍历的序列是从1到2的范围,它包括了下界(1)而不是上界(3)。
忽略范围(1)中的值,执行print语句,在下一次迭代中再次调用print语句,流程结束,因为2是范围内的最后一个值。
For-in循环执行步骤没有范围值
迭代 | 从Range返回的值 | 输出 |
1 | 被丢弃 |
Hello world! |
2 | 被丢弃 |
Hello world! |
for-in循环固定间隔使用步长
如果你想要在每次迭代中增加某个固定值的循环,而不是范围,那么你必须使用stride方法。
例3:for-in循环使用步长
let interval = 2
for i in stride(from: 1, to: 10, by: interval) {
print(i)
}
在上面的程序中,stride函数返回数字序列:1、3、5、7、9。
i的值被设置为序列(1)的第一个数字,并执行循环中的print语句,该语句在控制台中输出“1”。
执行语句之后,i的值被更新为另一个值(3),然后再次调用print语句。这个过程一直持续到访问序列的所有元素。
For-in循环执行步骤使用stride:
值 | 条件 (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 |
如何使用for-in循环访问集合的元素?
假设你有一个如下所示的字符串数组。如果你不了解数组,可以将数组看作一个可以存储多个值的容器。有关更详细的解释,请参见Swift数组。
let programmingLanguages = ["Swift", "Java", "Go","JavaScript","Kotlin","Python"]
如果有人告诉你打印所有的编程语言呢?
一种方法是使用索引作为编程语言[0],[1]…等等,直到你得到所有的元素,但这太乏味了。
这里来救援的是for-in循环,你可以使用这个循环如下:
例4:使用for-in循环访问数组(集合)中的元素
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"]
for language in programmingLanguages {
print(language)
}
在上面的程序中,迭代的序列是一个字符串数组。
language的值设置为数组的第一个元素,和里面的print语句执行循环在控制台输出“Swift”。
语句执行后,使用下一个元素更新数组的language,并再次调用print语句。这一过程持续进行直到最后一个元素的数组访问。
示例5:访问元素的字符串(集合)使用for-in循环
在swift中字符串也是集合,你可以使用for循环访问字符串中的每个字符。
for value in "I♥Swift!" {
print(value)
}
如何使用for-in循环访问集合的索引?
如果你想要访问数组的索引(数组中元素的位置,即0,1,2),你需要使用枚举方法如下:
例6:使用for-in循环访问数组的索引
let programmingLanguages = ["Swift", "Java", "Go", "JavaScript", "Kotlin", "Python"]
for (index, language) in programmingLanguages.enumerated() {
print("\(index):\(language)")
}
在这里,枚举方法返回一个元组(Int, String),该元组由数组中每个项的索引(Int)和值(String)组成。例如:(0,Swift), (1, Java)…
使用for-in循环,你可以逐个访问元组中的这些项。如果你不了解Tuple,你可以简单地将其视为可以容纳不同类型值的容器。有关更详细的解释,请参见本系列教程Swift元组tuple。
如何在for-in循环中使用where子句过滤元素?
你还可以使用where子句as从for in循环中过滤内容
for value in "I♥Swift!" where value != "!" {
print(value) // 删除惊叹号
}
在上面的程序中,遍历的序列是string(字符的集合)。
值设置为字符串的第一个字符,并使用where条件进行检查,如果条件返回true,则执行循环内的块(print语句),该语句在控制台中输出“I”。
执行语句后,值被更新为字符串的下一个字符,然后再次检查条件。如果条件返回false,则不执行该块,值将更新为下一个字符。
这个过程一直持续到访问字符串的最后一个字符。
过滤器使用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 |