Swift入门: 循环

2020-03-19 20:48:18 浏览数 (1)

电脑很擅长在你读这句话的时间里完成数十亿次无聊的任务。在代码中重复任务时,可以多次复制和粘贴代码,也可以使用循环——只要条件为真,就可以重复一段代码的简单编程构造。

为了演示这一点,我想向您介绍一个名为print()的特殊调试函数:您给它一些要打印的文本,它将打印它。如果你和我在Playground运行的一样,你会看到你的文本出现在结果窗口中。如果你在Xcode中运行一个真正的应用程序,你会看到你的文本出现在Xcode的日志窗口中。不管怎样,print()都是窥视变量内容的好方法。 看看这个代码:

代码语言:javascript复制
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循环构造遍历数组,因为您可以使用该常量索引到数组中。我们甚至可以使用它来索引成两个数组,如下所示:

代码语言:javascript复制
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。所以,我们可以这样重写代码:

代码语言:javascript复制
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…”好吧,你明白了。

一个重要的注意事项:尽管程序员通常使用ij甚至k作为循环常量,但是您可以随意命名它们:for personNumber in 0 ..< people.count是完全有效的。

While 循环

您将看到第三种循环,它重复一段代码,直到您告诉它停止为止。这是用来做一些事情,如游戏循环,你事先不知道游戏将持续多久-你只是不断重复“检查触摸,动画机器人,绘制屏幕,检查触摸…”等,直到最终用户点击按钮退出游戏并返回主菜单。

这些循环称为while循环,它们如下所示:

代码语言:javascript复制
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

0 人点赞