学习Swift和iOS开发第6部分:循环

循环是重复的代码块,我们可以用来对Swift中的多个数据执行一项操作。

DRY原则指出“不要自己重复”。这是一种已存在很长时间的编码原则,但是Swift中的循环是重复代码的块。

如何使用循环是一种好习惯? 虽然循环反复重复相同的代码,但这样做是在单个循环的范围内进行的。 例如,我们可以从数组中传入数据,并且可以对该集合的每个项目执行相同的操作。

这是Swift语言非常有用的组件。 在这篇文章中,我们将学习3种流行的Swift循环类型。 让我们变得循环! 🙃

搭建游乐场

首先,如果尚未打开Xcode,请点击Create New Playground 。 给它起一个类似Loops的名称,然后单击Next
选择某个位置以保存此.playground文件,然后单击“ Create以保存它。 您应该看到类似以下的屏幕:

删除左侧的所有样板代码,但根据需要保留import UIKit

为什么要使用循环

假设我们有4名员工在公司工作。 每个员工的薪水不同:

  • 员工1:$ 45,000
  • 员工2:$ 100,000
  • 员工3:$ 54,000
  • 员工4:$ 20,000(对不起,兄弟)。

创建4个变量(每个雇员一个),并将每个变量的值设置为上面的相关薪水:

 导入UIKitvar employee1Salary = 45000.0 
var employee2Salary = 100000.0
var employee3Salary = 54000.0
var employee4Salary = 20000.0

我们刚刚完成了2016年第四季度,我们度过了非常成功的一年。 我们希望给每个员工加薪10%。 在您的游乐场中,键入:

 导入UIKitvar employee1Salary = 45000.0 
var employee2Salary = 100000.0
var employee3Salary = 54000.0
var employee4Salary = 20000.0employee1Salary = employee1Salary +(employee1Salary * 0.10)

上面的代码执行操作45000.0 + (45000.0 * 0.10)因为它采用我们的变量值并将其加到自身的10%上。

在Playground的右侧,您应该看到一个新值-49500。

让我们为每位员工执行此操作:

  employee1Salary = employee1Salary +(employee1Salary * 0.10)//打印49500 
employee2Salary = employee2Salary +(employee2Salary * 0.10)//打印110000
employee3Salary = employee3Salary +(employee1Salary * 0.10)//打印59400
employee4Salary = employee4Salary +(employee1Salary * 0.10)//打印22000

我不了解您,但我闻到一些臭代码。 如果您在想,“等等。 我们正在重复自己……如果我们有100名员工该怎么办?”为100名员工执行此操作将非常耗费精力,并且可能会导致错误。
我们还违反了DRY原则(请勿重复自己)。

我们不需要有4个单独的变量来存储员工薪水。 让我们将它们合并为一个名为salaries数组:

  var salaries = [45000.0,100000.0,54000.0,20000.0] 

我们如何循环利用这些,并为每个人的工资增加10%? 好吧,我们可以输入:

 薪金[0] =薪金[0] +(薪金[0] * 0.10) 

但这将导致相同的问题。 我们仍然需要为每位员工编写一行代码,然后重复自己的工作。 ! 删除该行代码,仅保留名为salaries的数组。

我们如何解决这个问题? 这就是Swift中的循环变得非常有用的地方。 对于每位员工,我们给他们提供薪水,并且需要对每位员工执行相同的操作- salary + (salary * 10%) 。 让我们编写一个循环来处理这个问题。

写你的第一个循环

我们将编写的第一个循环称为repeat-while循环。 循环有几种不同的类型,但是它们都在满足或满足特定条件时重复运行代码。

编写重复循环

在我们的薪水变量下,键入:

  var salaries = [45000.0,100000.0,54000.0,20000.0] var x = 0 
重复{
x + = 1
},而(x <salaries.count)

您应该看到在Playground窗口的右侧,我们的循环运行了4次。 但为什么?

我们要求循环重复获取变量x的值并将其加1。
然后,我们的循环将根据声明的条件进行检查: x < salaries.count
我们要求它查看x的值是什么,然后查看它是否小于数组salaries的项目总数。
数组后的.count将为您提供该数组中有多少项的值。 如果我们看,这里有4个薪水,因此salaries.count = 4。

因此,在幕后,我们正在执行以下操作:

  var salaries = [45000.0,100000.0,54000.0,20000.0] var x = 0 
x + 1 //现在x = 1
//检查条件:1 <4为true,继续循环x + 1 //现在x = 2
//检查条件:2 <4为真,继续循环x + 1 //现在x = 3
//检查条件:3 <4为真,继续循环x + 1 //现在x = 4
//检查条件:4 <4为假,停止循环

加上10%的工资等式

现在我们需要做的就是添加薪水方程式,但是我们不会使用数字值来调用数组的特定元素(即salaries[0] ),而是使用变量x (即salaries[x] ),因为它是值在循环中从0迭代到3。 请记住,在Swift的数组中使用零索引,这意味着第一个元素编号为0。

将以下内容添加到重复循环中:

  var salaries = [45000.0,100000.0,54000.0,20000.0] var x = 0 
重复{
薪金[x] =薪金[x] +(薪金[x] * 0.10)
x + = 1
} while(x <salaries.count)//或者一种较短的写itrepeat的方法{
薪金[x] * = 1.1
x + = 1
},而(x <salaries.count)

变量x可以命名为任何东西,但是“ x”只是循环中常用的选择。 index是一个更罗word但又更具描述性的变量。 请记住,在数组中,索引是用于标识数组中每个元素的数字。

为了更具描述性,请将变量x更改为index 。 像这样:

  var salaries = [45000.0,100000.0,54000.0,20000.0] var index = 0 
重复{
薪金[指数] =薪金[指数] +(薪金[指数] * 0.10)
指数+ = 1
}而(索引<salaries.count)

那这是做什么的? 我们首先将index变量设置为0。
然后,我们声明一个repeat-while循环。 在重复块内,我们添加了一个方程式,该方程式将我们的薪水加到该项目当前薪水的10%,该指数与变量index相同(此时等于0)。
然后,将1加到index变量中,使其等于1。
最后,我们使用while条件检查索引是否仍然小于salaries数组中元素的总数。

似乎我在重复自己,但了解这一点非常重要。

编写 for-in 循环

另一种循环类型称为for-in循环。 它使您可以遍历一系列值并为每个值执行一个操作。

这是一个for-in循环的示例:

 对于x in 1…5 { 
打印(“索引:\(x)”)
}

如果将上面的代码键入到Playground中,您将看到结果“(5次)”,这意味着我们已循环5次。 在操场窗口底部的控制台中,您应该看到以下消息:

 索引:1 
索引:2
索引:3
索引:4
索引:5

x的值设置为1,然后我们打印消息Index: 1因为x等于1。
然后循环重新启动,但是这次x被设置为范围内的下一个值:2。
控制台将打印Index: 2 ,然后重复循环。 这一直持续到我们达到5的值为止。

…的使用表示“包含”,表示我们应包括从1到5的每个值。

如果我们要使其成为“独占”循环,以便我们的循环考虑范围中最后一个值以外的所有内容,则需要添加一个新的“独占”循环,如下所示:

 对于x in 1…5 { 
打印(“索引:\(x)”)
}对于1中的x。<5 {
打印(“专有索引:\(x)”)
}

您应该只看到第二行打印出4行。 这是因为我们要求它排除使用的最终值5。

for-in循环的开始由关键字for指示。 然后,我们创建一个名为x的变量,但可以将其命名为任何东西。
接下来,我们使用关键字in表示要声明一个值范围。
最后,我们说明循环应在哪些值内操作。

要继续上面的薪水示例,请在“操场”窗口中键入以下for-in循环:

 对于i in 0 .. <salaries.count { 
薪金[i] =薪金[i] +(薪金[i] * 0.10)
打印(薪水[i])
}

此循环创建一个名为i的变量,并声明范围为0到“小于” salaries.count的值。 由于salaries.count等于4,我们的循环是互斥的,并且由于4不小于4,因此只能检查0到3之间的值。
但是,这是完美的,因为我们的薪金数组的索引从零开始,到3。

上面的循环的流程是这样的:变量i设置为0 —我们范围内的第一个值。
然后i作为salaries数组的索引传入。
之后,我们进行数学运算以像以前一样增加10%的加薪。
最后,我们将提高的工资打印到下面的控制台。

这是for-in循环和repeat-while循环之间的主要区别:
在for-in循环中,占位符变量的值(在本例中为i )由我们最后设置的值范围修改。

在重复循环中,我们需要通过写入index += 1来增加变量index

创建一个 for-each 循环

下一个循环是针对您可能有可变数量的项目循环进行的。 我们使用了预定义范围或其中包含静态信息的数组。
如果所有薪水信息都存储在服务器上,并且随着新员工和解雇情况的变化,该怎么办? 如果我们要以静态数组手动输入每个人的薪水信息,则更改或修改任何人的薪水将变得更加困难。 如果要解雇某个雇员的工资,这将是一个麻烦的任务。

要编写一个for-each循环,请键入以下内容:

 薪水{ 
打印(“薪水:\(salary)”)
}

正如您在“操场”窗口底部的控制台中看到的那样,我们数组中的每个薪水都打印得很好。

上面的代码以关键字for开头,以指示我们正在创建循环。
然后,我们创建一个名为salary的变量,并要求它循环遍历salaries数组中的每个项目,直到到达结尾为止。
对于数组中的每个项目循环,我们将其值打印到一个String中,如下所示:“ Salary:24200.0”

就个人而言,我发现for-each循环是初学者最容易理解的,因为您可以将变量命名为与数组内容相关的特定名称。

包起来

循环是在学习编码时应了解的基本概念。 如果您对它们的工作方式感到困惑,建议您重新阅读这篇文章。 尝试几次键入示例。
在线进行研究也是一个好主意。 查找人们正在使用循环的示例和现实场景,并从中学习。

我们已经了解了Swift中的repeat-whilefor-infor-each循环。 现在,您可以遍历数据集合并编写更好,更高效的代码。 每当您需要一遍又一遍地执行相同的操作时,不要编写多行几乎重复的代码,而要使用循环! 在下一课中,我们将学习Swift词典。


行使
创建一个数组,存储甲壳虫乐队所有四个成员的姓名。 编写一个“ for-each”循环,遍历数组并打印每个披头士乐队成员的姓名。

创建另一个存储四个国家/地区人口的数组。 编写一个“ for-in”循环,遍历数组,并使用String Interpolation打印一个句子,并将填充值传递到句子中。 例如,“人口为12378932”。