Swift: Swift 运算符入门:算术比较逻辑运算符详解零基础教程
运算符是代码中的计算符号——本课带你掌握 Swift 中所有基本运算符的用法和实战技巧。
1. 你将学到
- 算术运算符:加、减、乘、除、取余
- 赋值运算符与复合赋值
- 比较运算符与布尔结果
- 逻辑运算符:与、或、非
- 三元运算符与数值类型转换
2. 一个财务分析师的真实故事
(1) 痛点:Int 除法丢失小数导致报表错误
Bob 是一家创业公司的财务分析师,需要计算季度收入增长率。他写了一段代码:
SWIFT
let currentRevenue = 250_000
let previousRevenue = 200_000
let growthRate = (currentRevenue - previousRevenue) / previousRevenue * 100
print("增长率:\(growthRate)%")
输出:
TEXT 📖 仅展示增长率:0%
Bob 知道实际增长率应该是 25%,但代码输出 0%。原因在于 Int 除法会截断小数——50,000 / 200,000 在整数运算中等于 0,乘以 100 还是 0。
(2) 使用 Double 进行精确计算的解法
把数据改为 Double 类型,除法就能保留小数:
SWIFT
let currentRevenue = 250_000.0
let previousRevenue = 200_000.0
let growthRate = (currentRevenue - previousRevenue) / previousRevenue * 100
print("增长率:\(growthRate)%")
输出:
TEXT 📖 仅展示增长率:25.0%
问题立刻解决。Bob 随后检查了过去 12 个月的报表,发现还有 4 处类似的 Int 除法精度丢失。
(3) 收益:用对运算符后报表准确率
| 维度 | 之前 | 之后 |
|---|---|---|
| 数值计算错误率 | 每月 3-5 次 | 0 次 |
| 报表审核时间 | 每次 2 小时 | 15 分钟 |
| 团队信任度 | "报告可能不准" | "数据可靠" |
| 运算符理解 | 不清楚 Int 除法行为 | 能主动选择正确类型 |
3. 算术与赋值运算符
算术运算符执行数学计算,赋值运算符将值存入变量。它们是 Swift 中使用最频繁的运算符。
graph LR
A[运算符] --> B["算术: + - * / %"]
A --> C["赋值: = += -= *= /="]
B --> D[数字计算]
C --> E[更新变量值]
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
+ |
加法 | 10 + 3 |
13 |
- |
减法 | 10 - 3 |
7 |
* |
乘法 | 10 * 3 |
30 |
/ |
除法 | 10 / 3 |
3(Int 截断) |
% |
取余 | 10 % 3 |
1 |
(1) 算术运算符
SWIFT
let a = 15
let b = 4
let sum = a + b // 19
let diff = a - b // 11
let prod = a * b // 60
let quot = a / b // 3(Int 除法截断小数)
let rem = a % b // 3(15 / 4 = 3 余 3)
⚠️ 注意: Int 除法会直接截断小数部分,不四舍五入。15 / 4 结果是 3 而不是 3.75。需要小数结果时用 Double。
(2) 复合赋值运算符
复合赋值运算符把算术运算和赋值合并,写法更简洁:
SWIFT
var score = 10
score += 5 // 等价于 score = score + 5 -> 15
score -= 3 // 等价于 score = score - 3 -> 12
score *= 2 // 等价于 score = score * 2 -> 24
score /= 4 // 等价于 score = score / 4 -> 6
| 复合运算符 | 含义 | 示例 | 等价写法 |
|---|---|---|---|
+= |
加并赋值 | x += 5 |
x = x + 5 |
-= |
减并赋值 | x -= 3 |
x = x - 3 |
*= |
乘并赋值 | x *= 2 |
x = x * 2 |
/= |
除并赋值 | x /= 4 |
x = x / 4 |
▶ 示例:月度支出统计
SWIFT
// ============================================
// 统计月度支出汇总
// 演示算术和复合赋值运算符
// ============================================
var monthlyExpenses = 0.0
let rent = 1200.00
let groceries = 450.50
let transportation = 85.00
let entertainment = 200.00
monthlyExpenses += rent
monthlyExpenses += groceries
monthlyExpenses += transportation
monthlyExpenses += entertainment
let annualExpenses = monthlyExpenses * 12
let weeklyAverage = monthlyExpenses / 4.33
print("月度总支出:$\(monthlyExpenses)")
print("年度总支出:$\(annualExpenses)")
print("周均支出:$\(String(format: "%.2f", weeklyAverage))")
输出:
TEXT 📖 仅展示月度总支出:$1935.5 年度总支出:$23226.0 周均支出:$447.23
4. 比较与逻辑运算符
比较运算符对两个值进行比较并返回 Bool 结果;逻辑运算符组合多个布尔条件。
graph TB
A[比较运算符] --> B["== 等于"]
A --> C["!= 不等于"]
A --> D["> 大于"]
A --> E["< 小于"]
A --> F[">= 大于等于"]
A --> G["<= 小于等于"]
B --> H[返回 Bool]
C --> H
D --> H
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 5 |
true |
!= |
不等于 | 5 != 3 |
true |
> |
大于 | 5 > 3 |
true |
< |
小于 | 5 < 3 |
false |
>= |
大于等于 | 5 >= 5 |
true |
<= |
小于等于 | 5 <= 3 |
false |
(1) 比较运算符
SWIFT
let age = 18
let isAdult = age >= 18 // true
let canDrive = age >= 16 // true
let isSenior = age > 65 // false
let userName = "Alice"
let isAdmin = userName == "Admin" // false
(2) 逻辑运算符
| 运算符 | 名称 | 含义 | 示例 |
|---|---|---|---|
&& |
与 | 两个条件都为 true 才返回 true | age >= 18 && hasLicense |
| ` | ` | 或 | |
! |
非 | 取反 | !isLoggedIn |
SWIFT
let hasTicket = true
let isVip = false
let canEnter = hasTicket && isVip // false
let canAccess = hasTicket || isVip // true
let isNotVip = !isVip // true
▶ 示例:用户权限检查
SWIFT
// ============================================
// 检查用户是否有权限访问管理后台
// 演示比较和逻辑运算符
// ============================================
let userAge = 22
let hasVerifiedEmail = true
let isBanned = false
let isAdmin = false
let isAdult = userAge >= 18
let canAccessSystem = isAdult && hasVerifiedEmail && !isBanned
let hasAdminAccess = isAdmin
let finalAccess = canAccessSystem || hasAdminAccess
print("成年:\(isAdult)")
print("已验证邮箱:\(hasVerifiedEmail)")
print("未被封禁:\(!isBanned)")
print("最终访问权限:\(finalAccess)")
输出:
TEXT 📖 仅展示成年:true 已验证邮箱:true 未被封禁:true 最终访问权限:true
5. 三元运算符与类型转换
三元运算符是 if-else 的简洁写法;数值类型转换让不同数据类型协同计算。
(1) 三元条件运算符
语法:条件 ? 值A : 值B——条件为 true 时返回值A,否则返回值B:
SWIFT
let score = 85
let grade = score >= 60 ? "Pass" : "Fail"
print(grade) // Pass
| 写法对比 | 代码量 | 可读性 |
|---|---|---|
| if-else 版本 | 5 行 | 清晰但冗长 |
| 三元版本 | 1 行 | 简洁,适合简单条件 |
SWIFT
var result: String
if score >= 60 {
result = "Pass"
} else {
result = "Fail"
}
let result2 = score >= 60 ? "Pass" : "Fail"
⚠️ 注意: 三元运算符适合简单二选一。条件复杂时请用 if-else。
(2) 数值类型转换
Int 和 Double 之间需要显式转换:
SWIFT
let x = 10 // Int
let y = 3.5 // Double
let result1 = Double(x) + y // 13.5
let result2 = x + Int(y) // 13(y 被截断为 3)
| 转换 | 语法 | 结果 |
|---|---|---|
| Int 转 Double | Double(intVal) |
保留整数部分,加 .0 |
| Double 转 Int | Int(doubleVal) |
截断小数,不四舍五入 |
| Int 转 String | String(intVal) |
转成文本 |
▶ 示例:折扣计算器
SWIFT
// ============================================
// 根据购买金额计算折扣
// 演示三元运算符和类型转换
// ============================================
let purchaseAmount = 120.0
let itemCount = 3
let discountRate: Double = purchaseAmount >= 100 ? 0.9 : 1.0
let finalAmount = purchaseAmount * discountRate
let averagePrice = finalAmount / Double(itemCount)
print("购买金额:$\(purchaseAmount)")
print("折扣率:\(Int((1 - discountRate) * 100))%")
print("最终金额:$\(finalAmount)")
print("商品数量:\(itemCount)")
print("件均价格:$\(String(format: "%.2f", averagePrice))")
let freeShipping = finalAmount >= 100 ? "Free Shipping" : "Shipping Fee"
print("运费:\(freeShipping)")
输出:
TEXT 📖 仅展示购买金额:$120.0 折扣率:10% 最终金额:$108.0 商品数量:3 件均价格:$36.00 运费:Free Shipping
6. 完整示例:月度预算分析工具
SWIFT
// ============================================
// 月度预算分析工具
// 功能:演示算术、比较、逻辑、三元运算符
// ============================================
import Foundation
// 1. 收入与支出数据
let salary = 5200.0
let rent = 1400.0
let food = 600.0
let transport = 120.0
let utilities = 200.0
let entertainment = 300.0
// 2. 使用算术和复合赋值计算
var totalExpenses = 0.0
totalExpenses += rent
totalExpenses += food
totalExpenses += transport
totalExpenses += utilities
totalExpenses += entertainment
let savings = salary - totalExpenses
let savingsRate = savings / salary * 100
// 3. 使用比较和三元判断财务状况
let isHealthy = savingsRate >= 20
let advice = isHealthy ? "Healthy" : "Needs Improvement"
// 4. 逻辑判断:单项是否超支
let rentTooHigh = rent > salary * 0.3
let foodTooHigh = food > salary * 0.15
let needsAdjustment = rentTooHigh || foodTooHigh
print("=== Monthly Budget ===")
print("Income: $\(salary)")
print("Expenses: $\(totalExpenses)")
print("Savings: $\(String(format: "%.2f", savings))")
print("Savings Rate: \(Int(savingsRate))%")
print("Status: \(advice)")
print("Needs Adjustment: \(needsAdjustment)")
// 5. 类型转换示例
let categoryCount = 5
let avgPerCategory = totalExpenses / Double(categoryCount)
print("Categories: \(categoryCount), Avg: $\(String(format: "%.2f", avgPerCategory))")
输出:
TEXT 📖 仅展示=== Monthly Budget === Income: $5200.0 Expenses: $2620.0 Savings: $2580.0 Savings Rate: 49% Status: Healthy Needs Adjustment: false Categories: 5, Avg: $524.00
❓ 常见问题
Q Int 除法如何得到小数结果?
A 至少把一个操作数转为 Double。例如 Double(10) / 3 得到 3.3333。或者声明时直接写成 10.0 / 3。
Q % 取余运算符能用于 Double 吗?
A Swift 的 % 只能用于整数。对浮点数取余用 truncatingRemainder(dividingBy:) 方法。
Q && 和 || 有短路求值吗?
A 有。&& 如果左侧为 false 就不再计算右侧;|| 如果左侧为 true 就不再计算右侧。合理利用短路特性可以提升效率。
Q 复合赋值运算符有返回值吗?
A 没有。x += 5 是语句不是表达式,不能用在赋值或比较中。这点和 C 语言不同。
📖 小节
- 算术运算符:
+-*/%,Int 除法会截断小数 - 复合赋值:
+=-=*=/=,简洁更新变量值 - 比较运算符:
==!=><>=<=,结果都是 Bool - 逻辑运算符:
&&(与)||(或)!(非),支持短路求值 - 三元运算符:
条件 ? 值A : 值B,一行实现二选一 - 数值类型转换:Double() 或 Int() 确保类型匹配
📝 作业
- 基础题: 用算术运算符计算一个矩形的面积和周长:长为 12.5,宽为 8.3,输出结果。
- 进阶题: 写一个程序判断某年是否为闰年。规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。用逻辑运算符组合条件。
- 挑战题: 写一个电费计算器。基础电价 $0.12/kWh,月用电量超过 300kWh 后超出部分按 $0.15/kWh。用三元运算符和算术运算符计算总电费。