控制流是编程语言中的一种基本结构,用于控制代码执行顺序和条件。Swift 提供了多种控制流结构,包括条件语句(if-else,switch),循环语句(for-in,while,repeat-while)以及控制转移语句(break,continue,fallthrough)。
条件语句
if-else 语句
在 Swift 中,if-else 语句用于根据条件执行不同的代码块。if-else 语句的基本语法如下:
1
2
3
4
5
if condition {
// code to execute if true
} else {
// code to execute if false
}
可以使用任何返回 Bool
值的表达式作为 condition
。如果 condition
的值为 true
,则执行第一个代码块。否则,执行第二个代码块。
例如,以下代码将判断一个数字是否为偶数:
1
2
3
4
5
6
let number = 10
if number % 2 == 0 {
print("The number is even.")
} else {
print("The number is odd.")
}
switch 语句
与其他语言不同,Swift 的 switch 语句比较灵活,可匹配多种类型的数据,包括整数、浮点数、字符串、枚举等。同时,Swift 的 switch 语句还支持匹配区间、元组、值绑定以及 where 子句等高级功能。
switch 语句的基本语法如下:
1
2
3
4
5
6
7
8
switch value {
case pattern1:
// code to execute when value matches pattern1
case pattern2, pattern3:
// code to execute when value matches pattern2 or pattern3
default:
// code to execute when value doesn't match any pattern
}
其中,value
是要匹配的值,可以是任意类型。pattern1
、pattern2
等是用于匹配 value
的模式。如果 value
匹配了某个模式,则执行该模式对应的代码块。如果 value
没有匹配上任何模式,则执行 default
对应的代码块。
例如,以下代码将根据用户输入的字符执行不同的操作:
1
2
3
4
5
6
7
8
9
let char: Character = "a"
switch char {
case "a", "A":
print("The input is a.")
case "b", "B":
print("The input is b.")
default:
print("The input is neither a nor b.")
}
如果用户输入的字符是 “a” 或 “A”,则输出 “The input is a.”;如果是 “b” 或 “B”,则输出 “The input is b.”;否则,输出 “The input is neither a nor b.”。
区间匹配
Swift 的 switch 语句允许匹配区间。例如,以下代码将根据分数范围输出不同的评价:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let score = 80
switch score {
case 0..<60:
print("You failed.")
case 60..<70:
print("You passed with a D.")
case 70..<80:
print("You passed with a C.")
case 80..<90:
print("You passed with a B.")
case 90...100:
print("You passed with an A.")
default:
print("Invalid score.")
}
如果分数小于 60 分,则输出 “You failed.”;如果在 60~69 分之间,则输出 “You passed with a D.”;以此类推。如果分数超出了 0~100 的范围,则输出 “Invalid score.”。
元组匹配
Swift 的元组(tuple)是一种有序的值集合。在 switch 语句中,可以使用元组来匹配多个值。例如,以下代码将根据点的坐标输出所在象限:
1
2
3
4
5
6
7
8
9
10
11
12
13
let point = (1, -2)
switch point {
case (1...Int.max, 1...Int.max):
print("The point is in the first quadrant.")
case (-Int.max...(-1), 1...Int.max):
print("The point is in the second quadrant.")
case (-Int.max...(-1), -Int.max...(-1)):
print("The point is in the third quadrant.")
case (1...Int.max, -Int.max...(-1)):
print("The point is in the fourth quadrant.")
default:
print("The point is on an axis.")
}
如果点的横坐标和纵坐标都大于 0,则输出 “The point is in the first quadrant.”;如果横坐标小于 0,纵坐标大于 0,则输出 “The point is in the second quadrant.”;以此类推。如果点在坐标轴上,则输出 “The point is on an axis.”。
值绑定
Swift 的 switch 语句允许在匹配模式中进行值绑定,将匹配到的值赋给临时常量或变量。例如,以下代码将根据用户输入的字符串判断其是否为数字:
1
2
3
4
5
6
7
let input = "123"
switch Int(input) {
case let .some(value):
print("The input is a number: \(value)")
case .none:
print("The input is not a number.")
}
如果用户输入的字符串可以转换为整数,则输出 “The input is a number: 123”;否则,输出 “The input is not a number.”。在第一个 case 中,使用 let
关键字对临时常量 value
进行了值绑定,将转换后的整数值赋给了 value
。
where 子句
Swift 的 switch 语句允许在模式中加入 where 子句,进一步限制匹配条件。例如,以下代码将根据天气状况输出不同的建议:
1
2
3
4
5
6
7
8
9
10
11
12
13
let weather = "rainy"
switch weather {
case "sunny":
print("It's a good day for outdoor activities.")
case "cloudy", "foggy":
print("It's a bit gloomy today.")
case "rainy" where temperature < 15:
print("It's cold and rainy outside. You should bring a coat.")
case "rainy" where temperature >= 15:
print("It's warm and rainy outside. You don't need a coat.")
default:
print("I don't know what to say.")
}
如果天气是晴朗的,则输出 “It’s a good day for outdoor activities.”;如果是多云或有雾,则输出 “It’s a bit gloomy today.”;如果是下雨且温度低于 15 度,则输出 “It’s cold and rainy outside. You should bring a coat.”;如果是下雨且温度高于等于 15 度,则输出 “It’s warm and rainy outside. You don’t need a coat.”;如果无法匹配任何情况,则输出 “I don’t know what to say.”。在第三个和第四个 case 中,使用了 where 子句限制了匹配条件。
循环语句
for-in 循环
Swift 的 for-in 循环用于遍历集合类型(如数组、字典等)中的元素。for-in 循环的基本语法如下:
1
2
3
for element in collection {
// code to execute for each element
}
其中,element
是集合中的每一个元素,collection
是要遍历的集合。在循环体内部,可以对 element
进行操作。
例如,以下代码将遍历一个数组并输出每个元素的值:
1
2
3
4
let array = [1, 2, 3, 4, 5]
for element in array {
print(element)
}
输出结果为:
1 2 3 4 5
while 循环
Swift 的 while 循环会在每次执行循环前先检查条件是否为真,只有条件为真时才会执行循环体。while 循环的基本语法如下:
1
2
3
while condition {
// code to execute while condition is true
}
其中,condition
是一个返回 Bool
值的表达式。
例如,以下代码将使用 while 循环计算 1 到 5 的和:
1
2
3
4
5
6
7
var sum = 0
var i = 1
while i <= 5 {
sum += i
i += 1
}
print("The sum is \(sum).")
输出结果为 “The sum is 15.”。在循环体内部,先将 i
加到 sum
中,再将 i
自增。
repeat-while 循环
Swift 的 repeat-while 循环与 while 循环类似,但它会先执行一次循环体,然后再检查条件是否为真,只有条件为真时才会继续执行循环体。repeat-while 循环的基本语法如下:
1
2
3
repeat {
// code to execute at least once
} while condition
其中,condition
是一个返回 Bool
值的表达式。
例如,以下代码将使用 repeat-while 循环计算 1 到 5 的阶乘:
1
2
3
4
5
6
7
var factorial = 1
var j = 1
repeat {
factorial *= j
j += 1
} while j <= 5
print("The factorial of 5 is \(factorial).")
输出结果为 “The factorial of 5 is 120.”。在循环体内部,先将 j
乘到 factorial
中,再将 j
自增。
控制转移语句
Swift 提供了多种控制转移语句,用于改变代码的执行顺序或跳出循环。以下是常用的控制转移语句:
break
Swift 的 break 语句可用于跳出 for-in、while 或 switch 语句。当程序遇到 break 语句时,会立即退出整个循环或 switch 语句。例如,以下代码将在找到第一个质数后退出循环:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let numbers = [2, 3, 4, 5, 6, 7, 8, 9]
for number in numbers {
if number == 1 {
continue
}
var isPrime = true
for i in 2..<number {
if number % i == 0 {
isPrime = false
break
}
}
if isPrime {
print("\(number) is prime.")
break
}
}
输出结果为 “2 is prime.”。在内层 for 循环中,如果发现 number
不是质数,则设置 isPrime
为 false,并使用 break 跳出循环。在外层 for 循环中,如果找到了第一个质数,则使用 break 跳出循环。
continue
Swift 的 continue 语句可用于跳过循环中的某些元素或代码块。当程序遇到 continue 语句时,会立即跳过当前元素或代码块,进入下一个循环或代码块。例如,以下代码将输出 1 到 10 中所有奇数的平方:
1
2
3
4
5
6
for i in 1...10 {
if i % 2 == 0 {
continue
}
print(i * i)
}
输出结果为:
1 9 25 49 81
在 for 循环中,如果当前元素是偶数,则使用 continue 跳过该元素,进入下一个元素。如果当前元素是奇数,则输出它的平方。
fallthrough
Swift 的 fallthrough 语句可用于在 switch 语句中穿透至下一个 case。当程序遇到 fallthrough 语句时,会继续执行下一个 case 的代码块,而不进行匹配。例如,以下代码将根据用户输入的数字输出相应的英文单词:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let digit = 3
var word = ""
switch digit {
case 0:
word = "zero"
case 1:
word = "one"
case 2:
word = "two"
fallthrough
case 3:
word += " and three"
default:
word = "unknown number"
}
print("The word for (digit) is (word).")
输出结果为 “The word for 3 is two and three.”。在第三个 case 中,使用 fallthrough 语句将执行流程穿透至下一个 case,即第四个 case。因此,最终的 word
值为 “two and three”。
return
Swift 的 return 语句可用于从函数或闭包中返回值,并立即退出函数或闭包。当程序遇到 return 语句时,会将指定的值返回给调用者,并结束当前函数或闭包的执行。例如,以下代码定义了一个函数,用于计算两个数的乘积:
1
2
3
func multiply(_ a: Int, _ b: Int) -> Int {
return a * b
}
在该函数中,使用 return 语句返回了参数 a
和 b
的乘积。
控制语句的嵌套使用
Swift 的控制语句支持嵌套使用,可以在一个控制语句的代码块中包含另一个控制语句。例如,以下代码将使用嵌套的 for-in 循环输出一个九九乘法表:
1
2
3
4
5
6
for i in 1...9 {
for j in 1...i {
print("\(j) x \(i) = \(i * j)", terminator: "\t")
}
print()
}
在外层 for 循环中,枚举 1 到 9 中的每个数字;在内层 for 循环中,枚举 1 到当前数字中的每个数字,并输出它们的乘积。