电脑很擅长在你读这句话的时间里完成数十亿次无聊的任务。在代码中重复任务时,可以多次复制和粘贴代码,也可以使用循环——只要条件为真,就可以重复一段代码的简单编程构造。
为了演示这一点,我想向您介绍一个名为print()
的特殊调试函数:您给它一些要打印的文本,它将打印它。如果你和我在Playground运行的一样,你会看到你的文本出现在结果窗口中。如果你在Xcode中运行一个真正的应用程序,你会看到你的文本出现在Xcode的日志窗口中。不管怎样,print()
都是窥视变量内容的好方法。
看看这个代码:
print("1 x 10 is (1 * 10)")
print("2 x 10 is (2 * 10)")
print("3 x 10 is (3 * 10)")
print("4 x 10 is (4 * 10)")
print("5 x 10 is (5 * 10)")
print("6 x 10 is (6 * 10)")
print("7 x 10 is (7 * 10)")
print("8 x 10 is (8 * 10)")
print("9 x 10 is (9 * 10)")
print("10 x 10 is (10 * 10)")
完成运行后,您将在结果窗格中显示“10倍”表。但这几乎不是有效的代码,事实上,一个更干净的方法是使用所谓的闭合范围运算符循环一系列数字,这是连续三个点:...
使用闭合范围运算符,我们可以用三行重新编写整个过程: for i in 1...10 { print("(i) x 10 is (i * 10)") } 结果窗格只显示循环的“(10次)”,这意味着循环运行了10次。如果您想知道循环实际做了什么,请立即单击“(10次)右侧的正方形。您将看到一个框,上面写着“10x10 is 100”,如果您右键单击它,您将看到选项“Value History”。现在点击它,你会看到下面的图片:
循环的作用是从1到10(包括1和10)进行计数,将该数字赋给常数i,然后在大括号内运行代码块。
如果你不需要知道你的号码,你可以用下划线代替。例如,我们可以打印一些泰勒·斯威夫特的歌词如下:
代码语言:javascript复制var str = "Fakers gonna"
for _ in 1 ... 5 {
str = " fake"
}
print(str)
每次循环进行时,都会在字符串中添加“Fakers gonna fake fake fake fake fake fake fake fake”字样。
如果Swift不必每次循环都将每个数字赋给一个变量,那么它可以更快地运行代码。因此,如果你在for i in…
中使用i
,Xcode会建议您将其更改_
。
有一种称为半开区间运算符,它们很容易混淆。半开区间运算符看起来像..<
,从一个数字向上计数,不包括另一个数字。例如,1..<5
将计算1、2、3、4。
在数组上循环
Swift提供了一种非常简单的方法来循环数组中的所有元素。因为Swift已经知道数组保存的是什么类型的数据,它将遍历数组中的每个元素,将其分配给您命名的常量,然后运行代码块。例如,我们可以打印出这样一个歌曲的列表:
代码语言:javascript复制var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]
for song in songs {
print("My favorite song is (song)")
}
您还可以使用for i in
循环构造遍历数组,因为您可以使用该常量索引到数组中。我们甚至可以使用它来索引成两个数组,如下所示:
var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]
for i in 0 ... 3 {
print("(people[i]) gonna (actions[i])")
}
您可能想知道半开放范围运算符有什么用途,但它对于处理数组特别有用,因为数组从零开始计数。因此,我们不必从0到3(包括3)进行计数,而是可以从0到3(不包括数组中的项数)进行计数。
记住:它们是从零开始计算的,所以如果它们有4个项,那么最大索引是3,这就是为什么我们需要将4排除在循环之外。
要计算数组中有多少项,请使用somerarray.count
。所以,我们可以这样重写代码:
var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]
for i in 0 ..< people.count {
print("(people[i]) gonna (actions[i])")
}
嵌套循环
如果你想的话,你可以把循环放在循环里,甚至把循环放在循环里——尽管你可能会突然发现你做了1000万次的事情,所以要小心!
我们可以组合前面的两个循环来创建:
代码语言:javascript复制var people = ["players", "haters", "heart-breakers", "fakers"]
var actions = ["play", "hate", "break", "fake"]
for i in 0 ..< people.count {
var str = "(people[i]) gonna"
for _ in 1 ... 5 {
str = " (actions[i])"
}
print(str)
}
输出“players gonna play play play play play”,然后“haters gonna…”好吧,你明白了。
一个重要的注意事项:尽管程序员通常使用i
、j
甚至k
作为循环常量,但是您可以随意命名它们:for personNumber in 0 ..< people.count
是完全有效的。
While 循环
您将看到第三种循环,它重复一段代码,直到您告诉它停止为止。这是用来做一些事情,如游戏循环,你事先不知道游戏将持续多久-你只是不断重复“检查触摸,动画机器人,绘制屏幕,检查触摸…”等,直到最终用户点击按钮退出游戏并返回主菜单。
这些循环称为while
循环,它们如下所示:
var counter = 0
while true {
print("Counter is now (counter)")
counter = 1
if counter == 556 {
break
}
}
这段代码引入了一个新的关键字break
。它用于在您决定的某个点退出一段时间或退出一个循环。没有它,上面的代码永远不会结束,因为要检查的条件只是“true”,而true
总是true
。没有break
语句,循环就是一个无限循环,这是一件坏事。
当您使用未知数据时,这些while
循环最有效,例如从internet下载数据、从XML等文件读取数据、查看用户输入等等。这是因为只有在运行循环足够多次之后,才知道何时停止循环。
有一个对应的break
称为continue
。虽然中断循环会立即停止执行并在循环之后直接继续,但继续循环只会退出循环的当前迭代-它将跳回到循环的顶部并从那里开始。
例如,请思考下面的代码:
代码语言:javascript复制var songs = ["Shake it Off", "You Belong with Me", "Look What You Made Me Do"]
for song in songs {
if song == "You Belong with Me" {
continue
}
print("My favorite song is (song)")
}
这首歌循环播放了三首泰勒·斯威夫特的歌曲,但只会打印出两首的名字。原因是continue
关键字:当循环尝试使用歌曲“You Belong with Me”时,continue
会被调用,这意味着循环会立即跳回到开始处–print(
)调用从未进行过,相反循环会继续直接“Look What You Made Me Do”。
本文来自Hacking with Swift给swift初学者的入门课程Swift for Complete Beginners 的Loops