常量与变量:let vs var
- 声明语法
1// 常量:一次赋值,终身不变 2let maximumLoginAttempts = 10 // 最大尝试次数,业务上不允许修改 3 4// 变量:可反复写入 5var currentAttempt = 0 // 当前尝试次数,失败+1 6
- 延迟赋值
只要「第一次读取前」完成初始化即可,不必一行写完。
1var randomGenerator = SystemRandomNumberGenerator() 2let isDevEnvironment = randomGenerator.next() % 3 == 0 3let timeout: Int 4if isDevEnvironment { 5 timeout = 100 // 开发环境宽松一点 6} else { 7 timeout = 10 // 生产环境严格 8} 9// 编译器会检查所有分支都赋值,否则报错 10
- 一次声明多个
1let red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF 2var x = 0, y = 0, z = 0 3
命名规则:Unicode 可用,但别作死
✅ 合法
1let π = 3.14159 2let 欢迎 = "Hello" 3let 🐶🐮 = "dogcow" 4
❌ 非法
1let 3x = 1 // 不能以数字开头 2let a-b = 0 // 不能含运算符 3let private = 1 // 虽能编译,但与访问控制关键字冲突,别这么干 4
基本数据类型一览表
| 类型 | 说明 | 字面量示例 | 备注 |
|---|---|---|---|
| Int | 平台字长 | 42, -7 | 32 位平台 == Int32;64 位 == Int64 |
| UInt | 无符号平台字长 | 42 | 仅当位运算/内存布局时才用 |
| Int8/16/32/64 | 指定位宽 | 127 | 与 C 交互、网络协议、二进制文件 |
| Double | 64 位浮点 | 3.14159, 1.25e2 | 默认推断类型 |
| Float | 32 位浮点 | 3.14 | 内存/带宽敏感场景 |
| Bool | 真/假 | true, false | 不能用 0/1 代替 |
| String | UTF-8 文本 | "Hello" | 值类型,拷贝即复制(写时优化) |
整数字面量“花式写法”
1let decimal = 17 2let binary = 0b10001 // 0b 前缀 3let octal = 0o21 // 0o 前缀 4let hex = 0x11 // 0x 前缀 5 6// 增加可读性 7let oneMillion = 1_000_000 8let rgb = 0xFF_FF_FF_00 9
类型推断与类型注解
- 推断
1let meaningOfLife = 42 // 推断为 Int 2let pi = 3.14159 // 推断为 Double(不是 Float) 3
- 显式注解
1var message: String = "Hello" // 显式告诉编译器 2// 如果不给初始值,必须写类型 3var score: Int 4score = 100 5
- 多变量同类型
1var a, b, c: Double // 3 个都是 Double 2
数值类型转换——“必须显式”
Swift 没有隐式类型转换,防止溢出 Bug。
1let age: UInt8 = 25 2let weight: UInt16 = 76 3 4// 错误:age + weight // 类型不一致 5let total = UInt16(age) + weight // ✅ 显式构造 6
浮点与整数互转:
1let x = 3 2let d = Double(x) + 0.14159 // 3.14159 3 4let fraction: Double = 4.75 5let whole = Int(fraction) // 4,截断(不会四舍五入) 6
类型别名 typealias——给长名字起小名
1typealias Byte = UInt8 2typealias AudioSample = UInt16 3 4let maxAmplitude = AudioSample.min // 0 5
工程场景:
- 与 C API 交互时,把
UInt32起别名叫CRC32,语义清晰。 - 以后底层类型换成
UInt64时,改一行即可,业务层无感知。
Print & 字符串插值
1let name = "Swift" 2print("Hello, \(name)!") // Hello, Swift! 3 4// 自定义 terminator 5print("Loading...", terminator: "") // 不换行 6
注释:可嵌套的多行注释
1/* 外层 2 /* 内层 1 3 /* 内层 2 */ 4 */ 5*/ 6
利用嵌套,可以快速“整块注释”掉代码,而不用担心内部已有注释冲突。
分号:可加可不加
1let a = 1; let b = 2 // 同一行多条语句才需要 2
小结 & 工程化思考
- 默认用 Int、Double,除非有明确位宽需求。
- 常量优先(let),减少可变状态。
- 命名用英文/中文均可,但团队要统一;CI 可加
--strict-conventions检查。 - 类型转换显式写,让 Code Review 一眼看出截断/溢出风险。
- typealias 不仅为了“少打字”,更是语义抽象,跨平台迁移利器。
《Swift 基础语法全景(一):从变量到类型安全》 是转载文章,点击查看原文。
