常用标准库类型速查
本教程共 93 篇 · 第 93 篇 · 更新于 2026-08-08 · 约 7 分钟阅读
本节目标:把最常用标准库类型的”长什么样、能干什么”压成一张可随手翻的表,写代码时不必每次去翻文档。
Swift 标准库体量很大,但日常 80% 的工作只围着几个类型转。下面按”你多久用一次”排序,挑最高频的属性与方法列出。每张表下的小字,是正文没强调、但容易踩的坑。
1-1 String:字符串
String 是值类型,赋值时拷贝语义(实际走写时复制,省内存)。它代表一系列字符,支持 Unicode,所以”字符数”不等于”字节数”。
| 常用项 | 说明 |
|---|---|
count | 字符个数(不是字节数) |
isEmpty | 是否为空串 |
+ / append(_:) | 拼接 |
contains(_:) | 是否包含子串 |
hasPrefix(_:) / hasSuffix(_:) | 是否以某串开头 / 结尾 |
lowercased() / uppercased() | 转大小写(返回新串) |
split(separator:) | 按分隔符切成数组 |
replacingOccurrences(of:with:) | 替换 |
firstIndex(of:) | 找某字符位置 |
String(format:...) | 格式化构造(需 import Foundation) |
Warning别用
string.characters.count之类旧写法,6.x 里直接string.count。另外count对复杂 emoji 按”字符”计,界面限制长度时要小心。
1-2 Array:数组
有序、可重复、值类型。下标越界会直接崩溃,这是用数组最容易出的事。
| 常用项 | 说明 |
|---|---|
count / isEmpty | 元素个数 / 是否为空 |
first / last | 首尾元素(可选,空时 nil) |
append(_:) / += | 追加 |
insert(_:at:) | 指定位置插入 |
remove(at:) / removeLast() | 移除 |
contains(_:) | 是否包含 |
firstIndex(of:) | 查位置 |
map / filter / reduce | 高阶变换 |
sorted() / reversed() | 排序 / 反转(返回新集合) |
enumerated() | 带下标遍历 |
joined(separator:) | 数组合成串 |
Tip遍历且需要下标时优先
for (i, v) in arr.enumerated(),比自己维护计数器清爽,也不易越界。
1-3 Dictionary:字典
键值对集合,键必须可哈希(Hashable)。读不存在的键返回 nil,不会崩——这正是它和数组下标最大的区别。
| 常用项 | 说明 |
|---|---|
count / isEmpty | 条目数 / 是否为空 |
keys / values | 键集合 / 值集合 |
dict[key] | 按下标取(返回可选) |
dict[key, default: x] | 取不到给默认值,且可写入 |
updateValue(_:forKey:) | 更新并返回旧值 |
removeValue(forKey:) | 删除 |
contains(where:) | 条件判断 |
mapValues(_:) | 只变换值,键不变 |
merging(_:uniquingKeysWith:) | 合并两个字典 |
Note
dict[key]永远返回可选,因为键可能不存在。想避免一堆解包,用dict[key, default: 0]这类下标默认值写法最省心。
1-4 Set:集合
无序、元素唯一、值类型。擅长去重和集合运算(交并差)。
| 常用项 | 说明 |
|---|---|
count / isEmpty | 元素数 / 是否为空 |
contains(_:) | 是否包含(极快) |
insert(_:) / remove(_:) | 增 / 删 |
union(_:) | 并集 |
intersection(_:) | 交集 |
subtracting(_:) | 差集 |
symmetricDifference(_:) | 对称差 |
isSubset(of:) / isSuperset(of:) | 子集 / 超集判断 |
用 Set 去重最常见:Array(Set(arr)) 一行搞定,只是顺序会乱。要保序去重得自己写循环。
1-5 Optional:可选类型
可选是 Swift 安全性的核心,本质是枚举 Optional<Wrapped>,只有 some(值) 和 none(即 nil) 两种状态。它提醒你”这里可能没有值”。
| 常用项 | 说明 |
|---|---|
? | 声明可选:Int? |
if let / guard let | 安全解包绑定 |
?? | nil 合并,给默认值 |
?. | 可选链,链式调用 |
! | 强制解包(无值则崩,慎用) |
map(_:) / flatMap(_:) | 有值时变换,无值返 nil |
nil | 表示”没有值” |
Warning强制解包
x!在 x 为 nil 时直接崩溃。只在你 100% 确定有值时才用,否则优先if let或??。
1-6 数值类型:Int / Double / Bool
整数默认 Int(跟随平台位宽),浮点用 Double。它们都遵循一堆协议,能直接做比较、哈希。
| 常用项 | 说明 |
|---|---|
Int.min / Int.max | 当前平台整数边界 |
Double.pi | 圆周率常量 |
rounded() / rounded(.down) | 四舍五入 / 向下取整 |
isZero / isNaN / isFinite | 浮点状态判断 |
magnitude | 绝对值 |
Bool 的 && ` |
Note别拿
Int和Double直接相加,类型不同会报错。显式转换:Double(x)或Int(y)。这是初学者高频编译错误。
1-7 元组 Tuple 与 区间 Range
元组是临时把几个值打包,不用专门定义类型;区间常用于循环和下标。
| 类型 | 常用项 | 说明 |
|---|---|---|
| 元组 | (name: "小明", age: 18) | 命名元素,用 .name 取 |
| 元组 | (0, "零") | 匿名元素,用 .0 .1 取 |
| 闭区间 | 1...5 | 含 5,类型 ClosedRange |
| 半开区间 | 1..<5 | 不含 5,类型 Range |
| 区间 | ~= | 模式匹配,用于 switch 和 contains |
元组常在函数要返回多个值时出场;区间最常被忘的能力是”判断某数在不在范围里”——range.contains(x),比手写 x >= a && x <= b 更清晰。
1-8 一个贯穿全局的区别:值语义与引用语义
前面这些类型里,String、Array、Dictionary、Set、Int、Double、Bool、元组都是值类型,赋值时拷贝(实际写时复制,省内存);而类 class 是引用类型,赋值只传引用。这差别直接影响”我改一个,另一个变不变”。
var a = [1, 2, 3]
var b = a
b.append(4)
// a 仍是 [1, 2, 3],b 是 [1, 2, 3, 4]
值类型这种”各改各的”特性,让并发和多线程下更安全——不会出现两个地方偷偷改同一个对象。理解这一点,你就不难决定何时用 struct 何时用 class,也明白为什么标准库集合默认都是值类型。
1-9 常用协议让类型更好用
这些类型之所以能直接 == 比较、print 打印、当字典键,是因为它们遵循了 Equatable、CustomStringConvertible、Hashable 等协议。你自己定义的类型若想享受同等待遇,只需声明遵循并让编译器合成默认实现:
struct Point: Equatable, Hashable {
let x: Int
let y: Int
}
编译器会自动合成 == 和 hash。这比手写安全,也不会漏掉某个字段。写自定义类型时,能遵循就遵循,标准库和算法(如 contains、firstIndex)会立刻认得它。
1-10 选类型的经验法则
存一组有序、可重复的同质数据用 Array;需要按键查找用 Dictionary;要去重或做集合运算用 Set;临时返回多个值用元组;不确定有没有值用 Optional 包一层。字符串当文本,数值当计算,区间当下标或判断。
初学者常犯的错是用 Array 硬当字典(靠下标找),或该用 Optional 却用空字符串表示”无”。选对类型,代码既短又不易错。这八类是你工具箱里最顺手的扳手,先用熟它们。类型选对了,后面的逻辑写起来会顺很多;选错了,往往要在业务代码里打各种补丁来弥补类型本身的缺陷,得不偿失。
1-11 小结
这八类类型覆盖了你绝大部分代码:String/Array/Dictionary/Set 是集合四件套,Optional 管”可能有/可能没有”,Int/Double/Bool 管数值,Tuple/Range 管临时组合与范围。记住它们的值语义(赋值即拷贝)和各自下标的返回类型(数组越界崩、字典返可选),能避开大多数运行时坑。到此,全书 93 章正文结束。
最后提醒一点:标准库远不止这些,像 Data(二进制)、Date(时间)、Result(结果或错误)、Character、IndexPath 等也很常用,但它们更偏特定场景,需要时再查官方文档即可。把今天这八类练到不用想就能用,你的 Swift 日常开发就稳了一大半。