Swift: Swift 变量与常量:var 和 let 用法详解零基础入门

变量如同带标签的盒子随时可以替换内容,常量则像封好的箱子不可更改——本课带你掌握 Swift 数据存储的两种核心方式。

1. 你将学到


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 声明常量(赋值后值不可变)。选择哪种方式取决于数据是否需要变化。

100%
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 提供四种最常用的基本数据类型,每种存储一种特定形式的数据。变量或常量的类型一旦确定,就不能存储其他类型的数据。

100%
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
⚠️ 注意: IntDouble 不能直接混合运算,需要显式类型转换。

(3) String — 文本

String 存储文本数据,用双引号包裹内容:

SWIFT
let userName = "Alice"
var message = "Welcome to Swift"
let empty = ""  // 空字符串

(4) Bool — 布尔值

Bool 只有 truefalse 两个值,用于条件判断:

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: Stringname = "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 也提供了 &+ 等溢出运算符来安全处理特殊情况。

📖 小节


📝 作业

  1. 基础题: 声明一个常量 let city = "New York" 和一个变量 var population = 8_400_000,用 print 输出 "New York has 8400000 people"。
  2. 进阶题: 定义一个 Double 类型的变量存储摄氏度温度,将其转换为华氏度(公式:℉ = ℃ × 9/5 + 32),输出两种单位的结果。
  3. 挑战题: 写一个货币兑换程序,用常量保存汇率(1 USD = 0.92 EUR),用变量保存美元金额,计算并输出对应的欧元金额。要求至少使用 Int、Double、String 三种类型。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏