Swift 字面量

Swift 字面量(Literals)全解析

“字面量 = 直接写在代码中的值” —— 掌握 7 种字面量,让你的代码更清晰、更高效!


一、什么是字面量?

字面量:在源代码中直接表示固定值的语法元素。

42          // 整数字面量
3.14        // 浮点数字面量
"Swift"     // 字符串字面量
true        // 布尔字面量

二、7 种核心字面量

类型字面量示例
整数Integer42, 0b1010, 0xFF
浮点数Floating-point3.14, 1.25e-2
字符串String"Hello", """多行"""
布尔值Booleantrue, false
数组Array[1, 2, 3]
字典Dictionary["name": "张三"]
nilNilnil

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]
ExpressibleByNilLiteralnilnil

自定义类型支持字面量

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

四、字面量类型推断规则

字面量默认类型可强制指定
42Int42 as UInt
3.14Double3.14 as Float
"hello"String
trueBool
[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
...
"""

八、速查表

字面量写法类型
十进制42Int
二进制0b1010Int
八进制0o52Int
十六进制0x2AInt
浮点数3.14Double
科学计数1.25e3Double
字符串"abc"String
多行"""abc"""String
数组[1,2,3][Int]
字典["a":1][String: Int]
nilnilOptional

总结:字面量使用黄金法则

法则说明
1. 用下划线分组提高可读性
2. 多行字符串处理 SQL/HTML避免转义地狱
3. 配置用字典字面量清晰直观
4. 自定义类型支持字面量提升 API 优雅度
5. 避免魔法数字let 常量包装

你已完全掌握 Swift 字面量!


回复关键词继续学习

  • Swift 自定义字面量
  • Swift 表达式宏
  • Swift 字符串插值进阶
  • SwiftUI 字面量预览

现在就用 0b 写出 255,用多行字符串写一首诗!

文章已创建 2481

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部