变量与常量:let 与 var
本教程共 93 篇 · 第 7 篇 · 更新于 2026-08-08 · 约 7 分钟阅读
本节目标:读完你能用 let 和 var 正确声明值,并理解 Swift 为什么总是建议你优先用 let。
几乎所有程序都在”存值、改值、用值”。Swift 把”值”分成两类:会变的和不会变的。怎么声明,直接决定了代码的安全和可读性。这一章就讲这对最基础的关键字。
1-1 let 与 var 各管什么
声明一个”设定后不再改变”的值,用 let,这叫常量。声明一个”以后还要改”的值,用 var,这叫变量。
let maximumLoginAttempts = 10
var currentLoginAttempt = 0
上面第一行说”最多允许尝试 10 次”,这个数字不会变,所以用 let。第二行”当前已尝试次数”每次失败都要加一,会变,所以用 var。
读起来就像在说:声明一个常量叫 maximumLoginAttempts,值是 10;声明一个变量叫 currentLoginAttempt,初值是 0。
1-2 常量改不了,变量能改
var 声明的值,之后可以重新赋值:
var welcome = "你好"
welcome = "Bonjour"
// welcome 现在是 "Bonjour"
而 let 声明的值,一旦设定就不能再改,硬改会在编译期报错:
let languageName = "Swift"
languageName = "Swift++"
// 编译错误:常量不能被修改
初学者这里很容易困惑:为什么要有这种限制?答案下一节说。
1-3 为什么 Swift 推荐多用 let
Swift 的设计哲学是:凡是不会改变的值,都该用 let 钉死。这么做有两个好处。
第一是安全。常量一旦定下就纹丝不动,你(或同事)后面不会不小心把它改掉,代码的意图一目了然——看到 let,你就知道这东西全程不变。
第二是清晰。当你用 let 标出”不变”、用 var 标出”会变”,读代码的人一眼就能抓住哪些地方是程序的状态变化点,调试时事半功倍。
苹果官方的建议很直接:只要一个值之后不会改变,永远用 let;只有确实需要改,才用 var。初学阶段,养成这个习惯比多学几个语法都重要。
1-4 声明时可以暂不赋值吗
可以,但有个铁律:常量或变量在第一次被读取之前,必须有值。先声明类型、后面再赋值,是允许的:
var environment: String
let maxAttempts: Int
if someCondition {
environment = "dev"
maxAttempts = 100
} else {
environment = "prod"
maxAttempts = 10
}
注意 maxAttempts 是 let,它在两个分支里分别被赋值一次,之后就固定了——这是合法的,因为每条路径都给了它唯一一个值。但如果你在某条路径忘了赋值,或者重复赋值给常量,编译器都会报错。
Tip经验法则:先写
let。如果编译器提示”这里需要改值”,再改成var。让编译器逼你做出正确选择,是 Swift 的温柔之处。
1-5 一行声明多个
同类型的多个变量或常量,可以写在一行,用逗号隔开:
var x = 0.0, y = 0.0, z = 0.0
let a = 1, b = 2
如果声明时给了初值,类型由初值推断,所以上面 x、y、z 都是 Double,a、b 都是 Int。
1-6 命名上有什么讲究
Swift 的常量/变量名相当自由,几乎能包含任何字符,包括中文和 emoji:
let π = 3.14159
let 你好 = "你好世界"
let 🐶 = "狗"
不过有几个禁区:不能有空格、不能有数学符号箭头、不能以内置的私有 Unicode 区字符命名,也不能以数字开头(数字可以出现在名字中间)。另外,如果非要用 Swift 关键字当名字,得用反引号包起来,比如 `let`,但除非实在没办法,别这么干。
1-7 名字不能重复、类型不能变
同一个作用域里,你不能声明两个同名的东西。也不能把一个 let 改成 var,或者反过来。更重要的是,一旦某个名字被声明成某类型,就不能再让它装别的类型的值。
var friendly = "hi"
friendly = "hello" // OK,还是字符串
friendly = 42 // 错误,不能把 Int 塞进字符串变量
类型安全在这里起作用:变量的值可以换,但”能装什么类型”从声明起就固定了。
1-8 把 let 刻进习惯
let 和 var 是 Swift 里最早、也最该刻进肌肉记忆的选择。很多转行来的开发者习惯一律用 var,图省事,结果代码里充斥本不该变的值,debug 时根本分不清哪处在改状态。Swift 把”不变”作为默认推荐,是帮你少写 bug 的设计,请尊重它。
一个实用心法:先写 let,如果编译器提示这里需要重新赋值,再改成 var。让编译器替你判断,比自己拍脑袋更可靠。你会发现,绝大多数日常变量其实根本不需要变。
命名也是门学问。Swift 允许中文和 emoji 当名字,但生产代码里几乎没人这么干——可读性和兼容性都劝你用清晰的英文或拼音命名。名字要能表达”这值是什么”,比如 maxRetry 比 m 好懂。看到 m 你得回去看上下文才知含义,看到 maxRetry 一眼就懂。
还有个常见误区:以为 let 声明的对象”完全不能动”。对值类型(如字符串、数组)确实如此;但对引用类型(如 class 实例),let 只是锁住”引用不能换”,实例内部的属性仍可能可变。这点等学到引用类型时再深究,现在先记住:常量保证的是”绑定的值/引用不变”。
变量和常量的作用域也值得留意:它们只在被声明的那对大括号(或文件顶层)内有效。把变量声明在尽量靠内的作用域,能减少名字冲突、也让意图更局部。初学阶段多在文件顶层声明,等学到函数、循环,作用域的概念会自然浮现。
1-9 补记:大小写与保留字
关于命名还有个细节:Swift 区分大小写,name 和 Name 是两个不同的名字。初学时常因为大小写拼错导致”找不到变量”,报错时先检查大小写。另外保留字(如 let、var、if)不能当名字用,除非用反引号包起来——但真到那种情况,多半是你该换个更好的名字了。
1-10 小结
let 声明常量(不可改),var 声明变量(可改)。Swift 强烈推荐默认用 let,只有确需变化才用 var——这能让代码更安全、意图更清楚。声明时可以带初值,也可以先定类型后赋值,但读取前必须有值。名字几乎随便起,但别重复、别换类型。下一章我们聊,为什么很多时候你连类型都不用写。