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