Swift提供了所有C语言中相似的控制流结构。包括for和while循环;if和switch条件语句;break和continue跳转语句等。
Swift还加入了for-in循环语句,让编程人员可以在遍历数组,字典,范围,字符串或者其它序列时更加便捷。
相对于C语言,Swift中switch语句的case语句后,不会自动跳转到下一个语句,这样就避免了C语言中因为忘记break而造成的错误。另外case语句可以匹配多种类型,包括数据范围,元组,或者特定的类型等。switch语句中已匹配的数值也可以被用在后续的case语句体中,where关键词还能被加入任意的case语句中,来增加匹配的方式。
1、for循环
for循环可以根据设置,重复执行一个代码块多次。Swift中提供了两种for循环方式:
for-in循环,对于数据范围,序列,集合等中的每一个元素,都执行一次
for-condition-increment,一直执行,知道一个特定的条件满足,每一次循环执行,都会增加一次计数
for-in循环
下面的例子打印出了5的倍数序列的前5项
for index in 1...5 {
println("\(index) times 5 is \(index * 5)")
}
// 1 times 5 is 5
// 2 times 5 is 10
// 3 times 5 is 15
// 4 times 5 is 20
// 5 times 5 is 25
</div>
迭代的项目是一个数字序列,从1到5的闭区间,通过使用(…)来表示序列。index被赋值为1,然后执行循环体中的代码。在这种情况下,循环只有一条语句,也就是打印5的index倍数。在这条语句执行完毕后,index的值被更新为序列中的下一个数值2,println函数再次被调用,一次循环直到这个序列的结尾。
在上面的例子中,index在每一次循环开始前都已经被赋值,因此不需要在每次使用前对它进行定义。每次它都隐式地被定义,就像是使用了let关键词一样。注意index是一个常量。
注意:index只在循环中存在,在循环完成之后如果需要继续使用,需要重新定义才可以。
如果你不需要序列中的每一个值,可以使用_来忽略它,仅仅只是使用循环体本身:
let base = 3
let power = 10
var answer = 1
for _ in 1...power {
answer *= base
}
println("\(base) to the power of \(power) is \(answer)")
// prints "3 to the power of 10 is 59049"
</div>
这个例子计算了一个数的特定次方(在这个例子中是3的10次方)。连续的乘法从1(实际上是3的0次方)开始,依次累乘以3,由于使用的是半闭区间,从0开始到9的左闭右开区间,所以是执行10次。在循环的时候不需要知道实际执行到第一次了,而是要保证执行了正确的次数,因此这里不需要index的值。
同理我们可以使用for-in来循环遍历一个数组的元素
let names = ["Anna", "Alex", "Brian", "Jack"]
for name in names {
println("Hello, \(name)!")
}
// Hello, Anna!
// Hello, Alex!
// Hello, Brian!
// Hello, Jack!
</div>
在遍历字典的时候,可以使用key-value对来进行遍历。每一个字典中的元素都是一个(key, value)元组,当遍历的时候,可以指定字段的key和value为一个特定的名称,这样在遍历的时候就可以更好地理解和使用它们,比如下面例子中的animalName和legCount:
let numberOfLegs = ["spider": 8, "ant": 6, "cat": 4]
for (animalName, legCount) in numberOfLegs {
println("\(animalName)s have \(legCount) legs")
}
// spiders have 8 legs
// ants have 6 legs
// cats have 4 legs
</div>
字典中的元素在遍历的时候一般不需要按照插入的顺序,因此不能保证遍历字典的时候,元素是有序的。更多跟数组和字典相关的内容可以参考:Collection Types
另外在数组和字典中也可以使用类似的遍历方式,如可以使用for-in循环来遍历字符串中的每一个字符:
for character in "Hello" {
println(character)
}
// H
// e
// l
// l
// o
</div>
For-Condition-Increment条件循环
Swift同样支持C语言样式的for循环,它也包括了一个条件语句和一个增量语句:
for var index = 0; index < 3; ++index {
println("index is \(index)")
}
// index is 0
// index is 1
// index is 2
</div>
下面是这种for循环的一般结构:
for initialization; condition; increment {
statements
}
</div>
分号在这里用来分隔for循环的三个结构,和C语言一样,但是不需要用括号来包裹它们。
这种for循环的执行方式是:
1、当进入循环的时候,初始化语句首先被执行,设定好循环需要的变量或常量
2、测试条件语句,看是否满足继续循环的条件,只有在条件语句是true的时候才会继续执行,如果是false则会停止循环。
3、在所有的循环体语句执行完毕后,增量语句执行,可能是对计数器的增加或者是减少,或者是其它的一些语句。然后返回步骤2继续执行。
这种循环方式还可以被描述为下面的形式:
initialization
while condition {
statements
increment
}
</div>
在初始化语句中被定义(比如var index = 0)的常量和变量,只在for循环语句范围内有效。如果想要在循环执行之后继续使用,需要在循环开始之前就定义好:
var index: Int
for index = 0; index < 3; ++index {
println("index is \(index)")
}
// index is 0
// index is 1
// index is 2
println("The loop statements were executed \(index) times")
// prints "The loop statements were executed 3 times"
</div>
需要注意的是,在循环执行完毕之后,index的值是3,而不是2。因为是在index增1之后,条件语句index < 3返回false,循环才终止,而这时,index已经为3了。
2、while循环
while循环执行一系列代码块,直到某个条件为false为止。这种循环最长用于循环的次数不确定的情况。Swift提供了两种while循环方式:
while循环,在每次循环开始前测试循环条件是否成立
do-while循环,在每次循环之后测试循环条件是否成立
while循环
while循环由一个条件语句开始,如果条件语句为true,一直执行,直到条件语句变为false。下面是一个while循环的一般形式: