首页 Swift中的控制流
文章
取消

Swift中的控制流

控制流是编程语言中的一种基本结构,用于控制代码执行顺序和条件。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 是要匹配的值,可以是任意类型。pattern1pattern2 等是用于匹配 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 语句返回了参数 ab 的乘积。

控制语句的嵌套使用

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 到当前数字中的每个数字,并输出它们的乘积。

本文由作者按照 CC BY 4.0 进行授权

Swift中的集合类型

Swift中的函数