Swift 数据类型

任何编程语言都有一组"内置基本数据类型",用来表示数字、文字、真假。Swift 的类型系统设计得很严谨——本章带你认识 Int、Double、Bool、String、Character,以及它们的转换规则。掌握这些,你就能写出 90% 的日常代码。

1. 整数:Int 家族

Swift 提供多种整数类型,按有无符号和位宽划分:

// 整数:有符号 Int / 无符号 UInt,以及各种位宽
let a: Int = 42              // 默认整数类型
let b: Int8 = 127            // 8 位,范围 -128 ~ 127
let c: UInt = 42             // 无符号
let d: Int64 = 9_000_000_000 // 下划线分隔,可读性更好

// Int 在 64 位平台 == Int64,32 位平台 == Int32
// 一般无脑用 Int 即可,除非要和 C 交互或省内存

// 进制字面量
let decimal = 42             // 十进制
let binary = 0b101010        // 二进制,等于 42
let octal = 0o52             // 八进制,等于 42
let hex = 0x2A               // 十六进制,等于 42

实战建议:默认用 Int。不要因为"我知道这个值不会超过 255"就用 UInt8——会让代码到处转换,得不偿失。Swift 团队明确推荐用 Int,即使是循环变量、数组下标。

2. 浮点数:Double 与 Float

// 浮点数:Double(64 位,默认) 和 Float(32 位)
let pi: Double = 3.14159265358979
let rate: Float = 0.5

// 科学计数法
let speed = 1.5e3            // 1500.0
let tiny = 1.2e-3            // 0.0012

// 注意:Float 精度只有 6-7 位有效数字,Double 15-16 位
// 金融、科学计算默认用 Double,不要图省内存用 Float

// 整数和浮点不能隐式转换
let intVal = 3
// let bad: Double = intVal  // 编译错误!
let good: Double = Double(intVal)  // 显式转换

绝大多数场景用 Double。Float 只在"海量数据 + 性能瓶颈 + 不在乎精度"时考虑(比如图形学/游戏)。注意,Swift 不会做隐式类型转换——整数和浮点相加,必须显式转换。这是 Swift 安全设计的体现,避免精度损失被忽略。

3. 布尔:Bool

Bool 只有两个值:truefalse。和 C/Python 不同,Swift 不允许用 0/1 当 Bool 用:

// 布尔:只有 true 和 false 两个值
let isLogged: Bool = true
let isEmpty = false

// 条件判断必须用 Bool,不能像 C 那样用 0/1
let count = 5
// if count { }              // 编译错误
if count > 0 { print("有") } // 必须显式比较

// 逻辑运算符
let canEnter = isLogged && !isEmpty
print(canEnter)

这条规则避免了一类经典 bug:"if (a = 5)" 把 == 写成 = 。Swift 强制你写明确的比较表达式。

4. 字符串:String(简版)

String 是 Swift 里最常用的类型之一,本章只讲基础,完整 API 留到字符串专章。先掌握三件事:

// 字符串:用双引号
let greeting = "Hello"
let chinese = "你好"

// 多行字符串:三个双引号
let poem = """
静夜思
床前明月光
疑是地上霜
"""

// 字符串插值:\(表达式)
let name = "小明"
let age = 18
print("\(name) 今年 \(age) 岁")

// 常用属性/方法
print(greeting.count)              // 5(字符数,不是字节)
print(greeting.uppercased())       // HELLO
print(greeting.hasPrefix("He"))    // true
print(greeting.contains("ll"))     // true

注意 .count 返回的是字符数而不是字节数。一个汉字或 emoji 的 count 都是 1,而不是 UTF-8 字节数。这一点和多数语言不同,但对于"用户感知的字符数"更准确。

5. 字符:Character

Character 表示单个 Unicode 字符。注意是"扩展字形集群"(extended grapheme cluster)——一个 emoji 比如 ❤️ 或 👨‍👩‍👧 也算一个 Character,虽然底层是多个 Unicode 标量:

// 字符:单个 Unicode 字符
let letter: Character = "A"
let heart: Character = "❤️"
let chinese2: Character = "明"

// 字符串可以看作 Character 的集合
for ch in "Swift" {
    print(ch)              // S w i f t (逐字符)
}

// 字符串拼接
let combined = "abc" + "def"
let repeated = String(repeating: "-", count: 20)
print(repeated)

6. 类型转换:必须显式

这是 Swift 区别于 Python/JS 的核心设计——不隐式转换。哪怕把 Int 赋给 Double 也不行(虽然有损精度可能性为零)。理由:让所有"可能损失数据"的操作都显式发生:

// Swift 不会做隐式类型转换,必须显式
let intA = 10
let doubleB = 2.5

// let sum = intA + doubleB   // 编译错误:类型不同
let sum = Double(intA) + doubleB   // 12.5
let sum2 = intA + Int(doubleB)     // 12(截断小数)

// 字符串与其他类型
let score = 95
let text = "分数: " + String(score)        // 字符串拼接
let text2 = "分数: \(score)"               // 字符串插值(推荐)

// 把字符串转成数字
let numStr = "42"
if let n = Int(numStr) {
    print(n + 1)            // 43
} else {
    print("不是数字")
}

新手会觉得啰嗦,但习惯后会发现 bug 大幅减少——再也不会有"我以为这里是浮点,结果是整数除法"的坑。

7. 其他常用字面量

8. 类型查看小技巧

想知道一个变量的类型,在 Playground 里 Option + Click 它,或用 type(of:) 函数:

let x = 3.14
print(type(of: x))   // Double
let s = "hi"
print(type(of: s))   // String

小结

Swift 的基本数据类型不多,但每一个都设计得严谨:整数用 Int、浮点用 Double、布尔用 Bool、文字用 String/Character,且类型转换必须显式。下一篇我们看 运算符——怎么操作这些数据。

← 上一篇 Swift 变量与常量

下一篇 Swift 运算符

✈️💬