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 位双精度,15~16 位有效数字。默认。
- Float:32 位单精度,6~7 位有效数字。
// 浮点数: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 只有两个值:true 和 false。和 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 留到字符串专章。先掌握三件事:
- 双引号包裹单行;三个双引号包裹多行。
- 插值用反斜杠加括号。
- Swift 的 String 是值类型(struct),赋值即复制,不会共享。
// 字符串:用双引号
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. 其他常用字面量
- 数组:
[1, 2, 3] - 字典:
["k": "v"] - nil:表示"无值",只能赋给 Optional 类型(后续专章讲)
- true / false:Bool 字面量
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 运算符 →