Swift: Swift 变量与常量:var 和 let 用法详解零基础入门
变量如同带标签的盒子随时可以替换内容,常量则像封好的箱子不可更改——本课带你掌握 Swift 数据存储的两种核心方式。
1. 你将学到
- var 声明变量与 let 声明常量的区别
- Swift 类型推断如何自动识别数据类型
- 四种基本数据类型:Int、Double、String、Bool
- 类型安全机制如何防止代码错误
- 不同类型之间如何进行类型转换
2. 一个电商数据分析师的真实故事
(1) 痛点:数字与文本混用导致程序崩溃
Alice 是一名电商数据分析师,每天处理超过 50,000 条订单记录。她写了段代码来统计某件商品的月销量变化:
SWIFT
var orderCount = "8500"
// 下个月订单增长 1200 件
orderCount = orderCount + 1200 // 编译错误!
Swift 不允许把文本和数字混在一起运算,Alice 的代码无法通过编译。她花了 30 分钟才找到问题根源——"8500" 外面的引号让 Swift 把它当作文本(String)而不是数字(Int)。
(2) 正确声明变量类型的解法
只要声明时去掉引号,Swift 就能正确推断 8500 是整数:
SWIFT
// 正确定义数据类型
var orderCount = 8500 // Int
var productName = "Headphones" // String
var unitPrice = 49.99 // Double
orderCount = orderCount + 1200
let totalRevenue = Double(orderCount) * unitPrice
print("商品:\(productName)")
print("本月销量:\(orderCount),收入:$\(totalRevenue)")
输出:
TEXT 📖 仅展示商品:Headphones 本月销量:9700,收入:$485,003.0
(3) 收益:理解类型后编码效率提升
| 维度 | 之前 | 之后 |
|---|---|---|
| 类型相关报错 | 每周 5-8 次 | 几乎为 0 |
| 单次调试时间 | 20-30 分钟 | 即时发现 |
| 代码可读性 | String 和 Int 混用 | 类型清晰可辨 |
| 对类型系统的理解 | "报错了就加引号试试" | "主动选择正确类型" |
3. 变量与常量
Swift 用 var 声明变量(值可变),用 let 声明常量(赋值后值不可变)。选择哪种方式取决于数据是否需要变化。
graph TB
A[数据存储] --> B["var 变量"]
A --> C["let 常量"]
B --> D[值可以修改]
B --> E["var age = 25"]
B --> F["age = 26 ✅"]
C --> G[值不可修改]
C --> H["let name = \"Alice\""]
C --> I["name = \"Bob\" ❌"]
| 特性 | var 变量 |
let 常量 |
|---|---|---|
| 值是否可改 | ✅ 可以重新赋值 | ❌ 不可改变 |
| 适用场景 | 计数器、累加结果、临时数据 | 固定配置、用户名、数学常量 |
| 编译器优化 | 普通 | 可能内联优化 |
| 推荐程度 | 只在需要时用 | 优先使用 |
(1) 变量 — 用 var 声明
变量用来存储程序运行过程中会变化的数据:
SWIFT
// 变量的值可以随时修改
var score = 0
score = 85 // 更新值
score = score + 10 // 基于当前值重新计算
💡 提示: 变量声明时如果同时赋初值,Swift 会自动推断类型,不需要写
: Int。
(2) 常量 — 用 let 声明
常量赋值后不可修改。用 let 声明可以防止因意外修改引发的错误:
SWIFT
// 常量赋值后无法修改
let maxLoginAttempts = 5
// maxLoginAttempts = 6 // ❌ 编译错误
let pi = 3.14159
let appName = "MyApp"
💡 提示: 苹果官方风格指南建议优先使用
let。只要数据不需要改变,就用 let 声明——代码更安全、更易理解。
▶ 示例:购物车数据管理
SWIFT
// ============================================
// 用变量管理购物车数量,用常量保存商品信息
// ============================================
// 常量:固定信息
let productName = "Wireless Headphones"
let unitPrice = 79.99
// 变量:变化的数据
var quantity = 1
print("商品:\(productName)")
print("单价:$\(unitPrice)")
print("当前数量:\(quantity)")
// 用户增加了购买数量
quantity = 3
let total = unitPrice * Double(quantity)
print("购买 \(quantity) 件,总价:$\(total)")
输出:
TEXT 📖 仅展示商品:Wireless Headphones 单价:$79.99 当前数量:1 购买 3 件,总价:$239.97
4. 基本数据类型
Swift 提供四种最常用的基本数据类型,每种存储一种特定形式的数据。变量或常量的类型一旦确定,就不能存储其他类型的数据。
graph TB
A[基本数据类型] --> B["Int 整数"]
A --> C["Double 浮点数"]
A --> D["String 文本"]
A --> E["Bool 布尔值"]
B --> F["42, -10, 0"]
C --> G["3.14, -0.5"]
D --> H["\"Hello\""]
E --> I["true / false"]
| 类型 | 含义 | 示例 | 内存占用 |
|---|---|---|---|
Int |
整数(正负和零) | 42, -10, 0 |
8 bytes |
Double |
浮点数(小数) | 3.14, -0.5 |
8 bytes |
String |
文本字符串 | "Hello", "Swift" |
动态 |
Bool |
布尔值 | true, false |
1 byte |
(1) Int — 整数
Int 存储整数。64 位设备上取值范围约 ±9.2 × 10^18:
SWIFT
let year = 2026
var count = -100
let population: Int = 8_000_000_000 // 下划线增强可读性
(2) Double — 浮点数
Double 存储带小数的数字,精度至少 15 位小数:
SWIFT
let temperature = 36.5
var price = 19.99
let taxRate = 0.08
⚠️ 注意:
Int 和 Double 不能直接混合运算,需要显式类型转换。
(3) String — 文本
String 存储文本数据,用双引号包裹内容:
SWIFT
let userName = "Alice"
var message = "Welcome to Swift"
let empty = "" // 空字符串
(4) Bool — 布尔值
Bool 只有 true 和 false 两个值,用于条件判断:
SWIFT
let isLoggedIn = false
var isAvailable = true
let isGreater = 10 > 5 // 比较结果自动得到 true
▶ 示例:用户信息类型检查
SWIFT
// ============================================
// 用不同类型存储用户信息
// ============================================
let userName = "Bob" // String
var age = 28 // Int
let height = 1.85 // Double
var isPremiumMember = false // Bool
print("姓名:\(userName)")
print("年龄:\(age)")
print("身高:\(height) m")
print("会员:\(isPremiumMember)")
// 类型安全——下面这行代码无法通过编译
// age = "twenty-eight" // ❌ String 不能赋值给 Int
输出:
TEXT 📖 仅展示姓名:Bob 年龄:28 身高:1.85 m 会员:false
5. 类型注解与类型转换
Swift 是类型安全的语言——每个变量和常量的类型在编译时就必须确定。你可以让 Swift 自动推断类型,也可以手动指定。
(1) 显式类型注解
在变量或常量名后面加冒号和类型名称,可以明确指定类型:
SWIFT
let name: String = "Charlie"
var age: Int = 25
var price: Double = 29.99
let isActive: Bool = true
| 方式 | 语法 | 适用场景 |
|---|---|---|
| 类型推断 | let name = "Alice" |
声明时可直接看出类型 |
| 类型注解 | let name: String = "Alice" |
明确类型意图、初始值不明确时 |
| 先声明后赋值 | var name: String → name = "Alice" |
无法在声明时立即赋值 |
(2) 类型转换
不同类型之间不能直接运算或赋值,必须显式转换:
SWIFT
let apples = 3
let pricePerApple = 0.99
// let total = apples * pricePerApple // ❌ Int 和 Double 不可直接相乘
let total = Double(apples) * pricePerApple // ✅ 将 Int 转为 Double
| 转换操作 | 含义 | 示例 |
|---|---|---|
Int(value) |
转整数(截断小数) | Int(3.14) → 3 |
Double(value) |
转浮点数 | Double(5) → 5.0 |
String(value) |
转文本 | String(42) → "42" |
▶ 示例:订单金额计算
SWIFT
// ============================================
// 计算订单总金额,演示类型转换
// ============================================
import Foundation
let itemCount = 5 // Int
let unitPrice = 12.99 // Double
let taxPercent = 0.08 // Double
// Int 需要转为 Double 才能参与运算
let subtotal = Double(itemCount) * unitPrice
let taxAmount = subtotal * taxPercent
let total = subtotal + taxAmount
print("商品数量:\(itemCount)")
print("单价:$\(unitPrice)")
print("小计:$\(subtotal)")
print("税费(8%):$\(taxAmount)")
print("总计:$\(total)")
// Double 转 String 用于文本拼接
let receipt = "总计:$" + String(format: "%.2f", total)
print(receipt)
输出:
TEXT 📖 仅展示商品数量:5 单价:$12.99 小计:$64.95 税费(8%):$5.196 总计:$70.146 总计:$70.15
6. 完整示例:订单统计汇总
SWIFT
// ============================================
// 电商订单统计汇总
// 功能:演示变量、常量、数据类型、类型转换
// ============================================
import Foundation
// 1. 常量:店铺信息和固定配置
let storeName = "Swift Gear Shop"
let taxRate = 0.07
// 2. 变量:可变订单数据
var orderCount = 0
var totalRevenue = 0.0
// 3. 处理第一批订单
let price1 = 49.99
let qty1 = 3
orderCount += qty1
let subtotal1 = Double(qty1) * price1
totalRevenue += subtotal1
// 4. 处理第二批订单
let price2 = 129.00
let qty2 = 1
orderCount += qty2
let subtotal2 = Double(qty2) * price2
totalRevenue += subtotal2
// 5. 输出统计报表
print("店铺:\(storeName)")
print("=== 销售统计 ===")
print("订单商品数:\(orderCount)")
print("总收入:$\(totalRevenue)")
print("预计税费:$\(totalRevenue * taxRate)")
print("净收入:$\(totalRevenue * (1 - taxRate))")
let summary = "今日共处理 " + String(orderCount) + " 件商品"
print(summary)
输出:
TEXT 📖 仅展示店铺:Swift Gear Shop === 销售统计 === 订单商品数:4 总收入:$278.97 预计税费:$19.5279 净收入:$259.4421 今日共处理 4 件商品
❓ 常见问题
Q let 和 var 在性能上有区别吗?
A 编译器对 let 常量可以做更多优化(如内联替换),性能略优于 var。但日常开发中差异微乎其微,优先考虑语义正确性即可。
Q 为什么 String 和 Int 不能直接拼接?
A 因为 String 和 Int 是两种完全不同的数据类型。Swift 是类型安全的语言,不允许隐式类型转换。需要用到字符串插值
\(value) 或 String() 函数显式转换。Q 什么时候必须写类型注解?
A 三种情况:声明时没有初始值、初始值可能有歧义、希望明确类型意图。例如
var score: Int 先声明后赋值,或 let value: Double = 5 明确让 5 变成 Double 而非 Int。Q Int 最大值是多少?溢出怎么办?
A 64 位设备上 Int 范围约 ±9.2 × 10^18。溢出时 debug 模式会崩溃提醒,但 Swift 也提供了
&+ 等溢出运算符来安全处理特殊情况。📖 小节
var声明变量(值可变),let声明常量(值不可变)- Swift 通过类型推断自动确定类型,无需每次都写类型注解
- 四种基本数据类型:Int(整数)、Double(小数)、String(文本)、Bool(布尔值)
- Swift 是类型安全的语言,不同类型不能混用或隐式转换
- 类型转换用
Type(value)语法,如Double(3)得到3.0 - 优先使用
let,只在需要改变值时用var
📝 作业
- 基础题: 声明一个常量
let city = "New York"和一个变量var population = 8_400_000,用 print 输出 "New York has 8400000 people"。 - 进阶题: 定义一个 Double 类型的变量存储摄氏度温度,将其转换为华氏度(公式:℉ = ℃ × 9/5 + 32),输出两种单位的结果。
- 挑战题: 写一个货币兑换程序,用常量保存汇率(1 USD = 0.92 EUR),用变量保存美元金额,计算并输出对应的欧元金额。要求至少使用 Int、Double、String 三种类型。