Swift基础入门(4):条件与循环语句

文章目录
  1. 1. 循环语句
    1. 1.1. for-in循环
    2. 1.2. for循环
    3. 1.3. while循环
    4. 1.4. do-while循环
  2. 2. 条件语句
    1. 2.1. if语句
    2. 2.2. switch语句
    3. 2.3. 元组
    4. 2.4. 额外条件(Where语句)
  3. 3. 控制转移语句
    1. 3.1. 贯穿语句(Fallthrough语句)
    2. 3.2. 精确控制转移

本篇介绍Swift的基础知识:条件语句和循环语句。

Title: Swift基础入门(4):条件与循环语句
Author: Yunyao Zhang(张云尧)
E-mail: aidaizyy@gmail.com
Last Modified: 2015-07-16

循环语句

for-in循环

1
2
3
4
5
6
7
8
for index in 1...5 {
println(index)
}
//1
//2
//3
//4
//5

for-in循环可用于区间。

1
2
3
4
5
6
7
8
9
10
var res = 1
for _ in 1...5 {
res *= 2
println(res)
}
//2
//4
//8
//16
//32

如果不需要区间中每项的值,可以用_替代。
for-in用于字符串,请见Swift基础入门(2)
for-in用于数组集合字典,请见Swift基础入门(3)

for循环

for循环和C语言一致,格式为for initialization; condition; increment { statements },区别在于没有括号。

while循环

while循环和C语言一致,格式为while condition { statements },区别在于没有括号。

do-while循环

do-while循环和C语言一致,格式为do { statements } while condition,区别在于没有括号。

条件语句

if语句

if语句和C语言一直,格式为if condition { statements } else if condition { statements } else { statesments },区别在于没有括号,else ifelse`不是必须存在。

switch语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
let count = 300
var naturalCount: String
switch count {
case 0:
naturalCount = "no"
case 1...3:
naturalCount = "a few"
case 4...9:
naturalCount = "several"
case 10...99:
naturalCount = "tens of"
case 100...999:
naturalCount = "hundreds of"
case 1000...999_999:
naturalCount = "thousands of"
default:
naturalCount = "millions and millions of"
}
println("There are \(naturalCount) stars in the Milky Way.")
// 输出 "There are hundreds of stars in the Milk Way."

在C语言中,通常使用break,避免执行了一个case语句后继续执行下一个case语句。在Swift语言中不需要添加breakswitch语句只执行最前面一个符合条件的case语句。
case语句可以接类似于1...3的区间。
case语句可以接多个情况,用逗号隔开,switch value { case value1, value2: statements }

元组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
let somePoint = (1, 1)
switch somePoint {
case (0, 0):
println("(0, 0) is at the origin")
case (_, 0):
println("(\(somePoint.0), 0) is on the x-axis")
case (0, _):
println("(0, \(somePoint.1)) is on the y-axis")
case (-2...2, -2...2):
println("(\(somePoint.0), \(somePoint.1)) is inside the box")
default:
println("(\(somePoint.0), \(somePoint.1)) is outside of the box")
}
// 输出 "(1, 1) is inside the box"
```
元组也可以用来判断条件,`_`用来匹配所有可能的值,也就是需要忽略的值。
## 值绑定
``` swift
let anotherPoint = (2, 0)
switch anotherPoint {
case (let x, 0):
println("on the x-axis with an x value of \(x)")
case (0, let y):
println("on the y-axis with a y value of \(y)")
case let (x, y):
println("somewhere else at (\(x), \(y))")
}

case语句中,可以用临时的常量变量去绑定值并使用。

额外条件(Where语句)

1
2
3
4
5
6
7
8
9
10
let yetAnotherPoint = (1, -1)
switch yetAnotherPoint {
case let (x, y) where x == y:
println("(\(x), \(y)) is on the line x == y")
case let (x, y) where x == -y:
println("(\(x), \(y)) is on the line x == -y")
case let (x, y):
println("(\(x), \(y)) is just some arbitrary point")
}
// 输出 "(1, -1) is on the line x == -y"

case语句中可以使用where语句跟在条件后作为额外的补充条件,需要同时满足两个条件才可以执行。

控制转移语句

Swift一共有四种控制转移语句:
-continue
-break
-fallthrough
-return

continuebreakreturn用法和C语言基本一致。
switch语句中,continuebreak都针对整个switch语句,而不是C语言中的一个case语句。遇到break后直接退出整个switch语句,而不是判断下一个casecontinue同理。

贯穿语句(Fallthrough语句)

1
2
3
4
5
6
7
8
9
10
11
let integerToDescribe = 5
var description = "The number \(integerToDescribe) is"
switch integerToDescribe {
case 2, 3, 5, 7, 11, 13, 17, 19:
description += " a prime number, and also"
fallthrough
default:
description += " an integer."
}
println(description)
// 输出 "The number 5 is a prime number, and also an integer."

Swift语言不支持在switch语句中贯穿多个case语句的情况,但有时我们需要这么做。这时我们可以加上关键字fallthrough,当遇到fallthrough时,就会继续执行下一个case语句。
注意:遇到fallthrough时会直接执行下一个case语句,而不是去判断条件。

精确控制转移

Swift语言中可以让breakcontinue精确地表示针对哪一个循环或条件语句,这称为带标签的语句(Labeled Statements)。
label name: while condition { statements },之后再执行break label namecontinue label name

1
2
3
4
5
6
7
8
9
10
//求第一个质数
loop: for integer in 1...10 {
switch integer {
case 2, 3, 5, 7, 11, 13, 17, 19:
println("\(integer) is a prime number")
break loop
default:
println("\(integer) is not a prime number")
}
}

上面代码中,给for-in循环指定了标签loop,我们要求得到第一个质数,所以当遇到质数后用break loop结束循环。如果不加标签,break只能结束switch语句,会继续执行循环,不能达到目的。

转载请注明原作者和出处。

如果觉得这篇文章对您有帮助或启发,请随意打赏~