Swift 字面量(Literals)全解析
“字面量 = 直接写在代码中的值” —— 掌握 7 种字面量,让你的代码更清晰、更高效!
一、什么是字面量?
字面量:在源代码中直接表示固定值的语法元素。
42 // 整数字面量
3.14 // 浮点数字面量
"Swift" // 字符串字面量
true // 布尔字面量
二、7 种核心字面量
| 类型 | 字面量 | 示例 |
|---|---|---|
| 整数 | Integer | 42, 0b1010, 0xFF |
| 浮点数 | Floating-point | 3.14, 1.25e-2 |
| 字符串 | String | "Hello", """多行""" |
| 布尔值 | Boolean | true, false |
| 数组 | Array | [1, 2, 3] |
| 字典 | Dictionary | ["name": "张三"] |
| nil | Nil | nil |
1. 整数字面量(Integer Literals)
let decimal = 17 // 十进制
let binary = 0b10001 // 二进制 = 17
let octal = 0o21 // 八进制 = 17
let hex = 0x11 // 十六进制 = 17
// 可读性分组(下划线被忽略)
let million = 1_000_000 // = 1000000
let bytes = 0xFF_FF_FF_FF // = 4294967295
类型推断:默认推断为
Int
2. 浮点数字面量(Floating-Point Literals)
let pi = 3.14159
let e = 2.71828
let small = 1.25e-3 // 科学计数法 = 0.00125
let large = 1.25e6 // = 1,250,000
// 分组
let price = 9_999.99
类型推断:默认推断为
Double(推荐)
3. 字符串字面量(String Literals)
单行字符串
let name = "Swift 编程"
let emoji = "I ❤️ Swift"
多行字符串(""")
let poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
特殊转义
| 转义 | 含义 |
|---|---|
\0 | 空字符 |
\\ | 反斜杠 |
\t | 制表符 |
\n | 换行 |
\" | 双引号 |
\' | 单引号 |
\u{24} | Unicode 标量 |
let path = "C:\\Windows\\System32"
let wiseWords = "孔子说:\"学而时习之\""
let dollarSign = "\u{24}"
字符串插值
let score = 95
let message = "你的得分:\(score) 分"
let multi = "\(score * 2) 是双倍!"
4. 布尔字面量(Boolean Literals)
let yes = true
let no = false
// 不能用 0/1
// let flag = 1 // Int,不是 Bool
类型:
Bool
5. 数组字面量(Array Literals)
let numbers = [1, 2, 3, 4, 5]
let empty: [Int] = []
let names = ["张三", "李四", "王五"]
// 类型推断为 [Int], [String]
6. 字典字面量(Dictionary Literals)
let scores = [
"张三": 95,
"李四": 88,
"王五": 70
]
let emptyDict = [String: Int]()
类型推断:
[String: Int]
7. nil 字面量
let optionalName: String? = nil
let optionalArray: [Int]? = nil
表示可选类型的“无值”状态
三、字面量协议(Literal Protocols)
Swift 支持自定义类型直接使用字面量!
| 协议 | 支持字面量 | 示例 |
|---|---|---|
ExpressibleByIntegerLiteral | 整数 | 42 |
ExpressibleByFloatLiteral | 浮点数 | 3.14 |
ExpressibleByStringLiteral | 字符串 | "hello" |
ExpressibleByBooleanLiteral | 布尔值 | true |
ExpressibleByArrayLiteral | 数组 | [1,2,3] |
ExpressibleByDictionaryLiteral | 字典 | ["a":1] |
ExpressibleByNilLiteral | nil | nil |
自定义类型支持字面量
struct Temperature: ExpressibleByFloatLiteral {
var celsius: Double
init(_ value: Double) {
self.celsius = value
}
init(floatLiteral value: Double) {
self.celsius = value
}
}
// 直接使用字面量!
let temp: Temperature = 36.6
print(temp.celsius) // 36.6
四、字面量类型推断规则
| 字面量 | 默认类型 | 可强制指定 |
|---|---|---|
42 | Int | 42 as UInt |
3.14 | Double | 3.14 as Float |
"hello" | String | |
true | Bool | |
[1,2,3] | [Int] | [Double] = [1.0, 2.0] |
["a":1] | [String: Int] |
let x: UInt8 = 255 // 显式指定
let f: Float = 3.14 // 强制为 Float
五、高级用法
1. 自定义整数类型
struct Byte: ExpressibleByIntegerLiteral {
var value: UInt8
init(integerLiteral value: Int) {
self.value = UInt8(value)
}
}
let b: Byte = 255 // 直接赋值!
2. 配置字面量
struct API {
let baseURL: URL
let timeout: TimeInterval
}
// 支持字典字面量
extension API: ExpressibleByDictionaryLiteral {
init(dictionaryLiteral elements: (String, Any)...) {
var url = URL(string: "https://api.com")!
var timeout = 30.0
for (key, value) in elements {
if key == "url", let u = value as? String {
url = URL(string: u)!
}
if key == "timeout", let t = value as? Double {
timeout = t
}
}
self.baseURL = url
self.timeout = timeout
}
}
let api: API = ["url": "https://example.com", "timeout": 60]
六、最佳实践
| 场景 | 推荐写法 |
|---|---|
| 大数字 | 1_000_000 |
| 十六进制颜色 | 0xFF_00_00 |
| SQL/JSON | 多行字符串 """ |
| 配置 | 字典字面量 + 自定义类型 |
| 常量 | let PI = 3.14159 |
七、实战小练习
// 1. 定义一个支持数组字面量的配置类型
struct AppConfig: ExpressibleByArrayLiteral {
// 你的代码
}
// 使用:let config: AppConfig = ["debug", true, "version", 1.0]
// 2. 写出二进制表示 42 的字面量
let fortyTwo = 0b101010
// 3. 多行字符串打印九九乘法表
let table = """
1x1=1
1x2=2
...
"""
八、速查表
| 字面量 | 写法 | 类型 |
|---|---|---|
| 十进制 | 42 | Int |
| 二进制 | 0b1010 | Int |
| 八进制 | 0o52 | Int |
| 十六进制 | 0x2A | Int |
| 浮点数 | 3.14 | Double |
| 科学计数 | 1.25e3 | Double |
| 字符串 | "abc" | String |
| 多行 | """abc""" | String |
| 数组 | [1,2,3] | [Int] |
| 字典 | ["a":1] | [String: Int] |
| nil | nil | Optional |
总结:字面量使用黄金法则
| 法则 | 说明 |
|---|---|
| 1. 用下划线分组 | 提高可读性 |
| 2. 多行字符串处理 SQL/HTML | 避免转义地狱 |
| 3. 配置用字典字面量 | 清晰直观 |
| 4. 自定义类型支持字面量 | 提升 API 优雅度 |
| 5. 避免魔法数字 | 用 let 常量包装 |
你已完全掌握 Swift 字面量!
回复关键词继续学习:
Swift 自定义字面量Swift 表达式宏Swift 字符串插值进阶SwiftUI 字面量预览
现在就用 0b 写出 255,用多行字符串写一首诗!