运算符和表达式
学习如何在 Swift 表达式中使用变量和常量,为代码添加逻辑。
到目前为止,我们已经学习了在 Swift 中使用变量和常量,并介绍了不同的数据类型。然而,能够创建变量只是故事的一部分。下一步是学习如何在 Swift 代码中使用这些变量和常量。处理数据的主要方法是通过表达式。
Swift 中的表达式语法
最基础的 Swift 表达式由一个运算符、两个操作数和一个赋值操作组成。以下是一个表达式的示例:
1var myresult = 1 + 2
在上面的例子中,+ 运算符用于将两个操作数(1 和 2)相加。随后,赋值操作符(=)将加法的结果赋给名为 myresult 的变量。操作数也可以是变量(或常量与变量的组合),而不仅仅是示例中的具体数值。
1var myresult = 1 + 2 2 3print(myresult)
在本课的剩余部分,我们将介绍 Swift 中可用的基本运算符类型。
基本赋值操作符
我们已经了解了最基本的赋值操作符,即 = 操作符。这个操作符简单地将表达式的结果赋给一个变量或常量。本质上,= 赋值操作符接受两个操作数:左操作数是要赋值的目标变量或常量,右操作数是要赋的值。右操作数通常是一个执行某种算术或逻辑计算的表达式,其结果会被赋给目标变量或常量。以下都是赋值操作符的有效用法:
1var x: Int? // 声明一个可选的 Int 变量 2var y = 10 // 声明并初始化另一个 Int 变量 3 4x = 10 // 给 x 赋值 5print("x = \(x!)") 6 7x = x! + y // 将 x + y 的结果赋给 x 8print("x = \(x!)") 9 10x = y // 将 y 的值赋给 x 11print("x = \(x!)")
Swift 算术运算符
Swift 提供了一系列运算符,用于构建数学表达式。这些运算符主要属于二元运算符,因为它们需要两个操作数。唯一的例外是一元负号运算符(-),它用于表示一个值为负数,而不是正数。这与减法运算符(-)不同,后者需要两个操作数(即从一个值中减去另一个值)。例如:
1var x = -10 // 使用一元 - 运算符将 -10 赋给变量 x 2x = x - 5 // 减法运算符。从 x 中减去 5
以下是 Swift 主要算术运算符的列表:
| 运算符 | 描述 |
|---|---|
| -(一元) | 对变量或表达式的值取反 |
| * | 乘法 |
| / | 除法 |
| + | 加法 |
| - | 减法 |
| % | 取余/模运算 |
注意,你可以在一个表达式中使用多个运算符。当然,可以通过将子表达式放在括号(())中来改变运算优先级:
1let y = 20 2let z = 35 3 4var x = y * 10 + z - 5 / 4 5print("x = \(x)") 6 7x = y * (10 + z) - 5 / 4 // 先将 z 加到 10 上 8print("x = \(x)")
复合赋值运算符
在前面的部分中,我们讨论了赋值运算符(=)。Swift 提供了许多运算符,用于将赋值与数学或逻辑操作结合。这些运算符在需要将结果存储回其中一个操作数时特别有用。例如,你可以这样写一个表达式:
1var x = 10 2let y = 20 3 4x = x + y 5 6print("x = \(x)")
上述表达式将变量 x 中的值与变量 y 中的值相加,并将结果存储回变量 x。这可以通过使用加法复合赋值运算符(+=)简化:
1var x = 10 2let y = 20 3 4x += y 5 6print("x = \(x)")
上述表达式与 x = x + y 完全等价,但减少了输入量。
Swift 提供了多种复合赋值运算符,其中最常用的是以下几种:
| 运算符 | 描述 |
|---|---|
| x += y | 将 y 加到 x 上,并将结果存入 x |
| x -= y | 从 x 中减去 y,并将结果存入 x |
| x *= y | 将 x 乘以 y,并将结果存入 x |
| x /= y | 将 x 除以 y,并将结果存入 x |
| x %= y | 对 x 和 y 执行模运算,并将结果存入 x |
注意:Swift 不包含许多其他语言中常见的自增和自减操作(如
i++、++i、--i和i--)。Swift 中最接近的等价形式是+=和-=运算符(例如i += 1)。
比较运算符
Swift 还提供了一组用于执行比较的逻辑运算符。这些运算符根据比较结果返回布尔值(true 或 false)。这些运算符都是二元运算符,因为它们作用于两个操作数。
比较运算符最常用于构建程序流程控制逻辑。例如,if 语句可以根据一个值是否等于另一个值来构造:
1if x == y { 2 // 执行任务 3}
比较的结果也可以存储在一个 Bool 类型的变量中。例如,以下代码将导致 true 值被存储在名为 result 的变量中:
1var result: Bool? 2var x = 10 3var y = 20 4 5result = x < y 6 7print("result = \(result!)")
显然,10 小于 20,因此 x < y 表达式的结果为 true。以下是 Swift 比较运算符的完整列表:
| 运算符 | 描述 |
|---|---|
| x == y | 如果 x 等于 y,则返回 true |
| x > y | 如果 x 大于 y,则返回 true |
| x >= y | 如果 x 大于或等于 y,则返回 true |
| x < y | 如果 x 小于 y,则返回 true |
| x <= y | 如果 x 小于或等于 y,则返回 true |
| x != y | 如果 x 不等于 y,则返回 true |
布尔逻辑运算符
Swift 还提供了一组称为逻辑运算符的运算符,用于返回布尔值 true 或 false。这些运算符返回布尔结果,并以布尔值作为操作数。主要的运算符包括:非(!)、与(&&)和或(||)。
非运算符(!)简单地反转布尔变量的当前值或表达式的结果。例如,如果名为 flag 的变量当前为 true,在其前加上 ! 字符将使其值变为 false:
1var flag = true // 变量为 true 2var secondFlag = !flag // secondFlag 被设为 false
或运算符(||)只要其两个操作数中有一个为 true,就返回 true;否则返回 false。例如,以下代码的计算结果为 true,因为 OR 运算符两侧至少有一个表达式为 true:
1if (10 < 20) || (20 < 10) { 2 print("表达式为真") 3}
与运算符(&&)仅当两个操作数都为 true 时才返回 true。以下示例将返回 false,因为两个操作数表达式中只有一个为 true:
1if (10 < 20) && (20 < 10) { 2 print("表达式为真") 3} else { 4 print("表达式为假") 5}
三元运算符
Swift 支持三元运算符,用于在代码中快速做出决策。三元运算符(也称为条件运算符)的语法如下:
1condition ? true expression : false expression
三元运算符的工作方式是:condition 被替换为一个返回 true 或 false 的表达式。如果结果为 true,则执行替换“真表达式”的部分;反之,如果结果为 false,则执行“假表达式”部分。让我们看一个实际例子:
1let x = 10 2let y = 20 3 4print("最大数是 \(x > y ? x : y)")
上述代码会判断 x 是否大于 y。显然,该判断结果为 false,因此返回 y 并传递给 print 函数显示给用户。
空合并运算符
空合并运算符(??)允许在可选值为 nil 时使用默认值。以下示例将输出“欢迎回来,顾客”,因为 customerName 可选值被设置为 nil:
1let customerName: String? = nil 2 3print("欢迎回来,\(customerName ?? "顾客")")
另一方面,如果 customerName 不为 nil,则可选值会被解包并显示其赋值内容:
1let customerName: String? = "John" 2 3print("欢迎回来,\(customerName ?? "顾客")")
执行后,print 语句的输出将变为“欢迎回来,John”。
课程总结
-
Swift 表达式由操作数和运算符组成。
-
Swift 包含一系列算术、比较和布尔逻辑运算符。
-
复合赋值运算符可以简化基本的算术赋值表达式。
-
三元运算符提供了一种简洁的方式来根据表达式是否为真来决定采取何种操作。
-
空合并运算符允许在可选值为
nil时使用默认值。
测验
通过完成以下测验来检验你对 Swift 运算符和表达式的掌握程度。
练习
通过以下练习来加强你对 Swift 运算符和表达式的理解。
练习 1
使用三元运算符判断常量 x 是奇数还是偶数。
练习
1let x = 11
解答
1let x = 11 2 3print("数字是 \((x % 2 == 0) ? "偶数" : "奇数")") 4 5// 上述代码使用取模 (%) 运算符计算 x 除以 2 的余数。 6// 该余数结果随后与 0 比较,根据布尔值 true 或 false 决定在 print 消息中插入 "偶数" 或 "奇数" 字符串。
练习 2
编写一个 if 语句,使用逻辑与运算符判断 x 是否为偶数且小于 100。
练习
1let x = 10
解答
1let x = 10 2 3if ((x < 100) && (x % 2 == 0)) { 4 print("偶数且小于 100") 5} else { 6 print("奇数或大于等于 100") 7}
Quiz
以下哪一项使用了复合赋值运算符?