首页 / Swift 编程语言教程 / 元组 Tuple

Swift 编程语言教程

元组 Tuple

本教程共 93 篇 · 第 12 篇 · 更新于 2026-08-08 · 约 7 分钟阅读

SwiftSwift 编程语言教程元组Tuple解构多返回值复合值

本节目标:读完你能用元组把多个值打包成一个复合值,并会用解构、下标、命名元素三种方式取用其中的成员。

有时候你需要把几个相关的值捆在一起传递,比如一个网页请求的结果既有状态码又有描述文字。Swift 提供了一个轻量容器——元组(Tuple),专门干这种”临时打包”的活。这一章把它讲透。

1-1 元组是什么

元组把多个值组合成一个复合值。里面的值可以是任意类型,而且彼此不必相同。

let http404Error = (404, "Not Found")

这行造了一个元组,类型是 (Int, String),意思是”一个整数加一个字符串”。它描述了 HTTP 状态码:数字 404 配上一句人能读的描述 “Not Found”。

你可以任意排列类型的组合:(Int, Int, Int)(String, Bool) 都行。元组不是什么高深结构,就是一根把几个值绑在一起的绳子。

1-2 解构:拆回独立的值

拿到一个元组,最常见的用法是把它”解构”成几个独立的常量或变量,之后像普通值一样用:

let (statusCode, statusMessage) = http404Error
print("状态码是 \(statusCode)")
print("描述是 \(statusMessage)")

解构时,元组里第几个值就对应第几个名字。解构后 statusCodeIntstatusMessageString,各自独立。

1-3 只取一部分:用下划线忽略

如果只关心元组里某几个成员,不想要的全用下划线 _ 跳过:

let (justCode, _) = http404Error
print("只要状态码 \(justCode)")

下划线是 Swift 里”我不要这个值”的通用占位符。这样你不用为了忽略而硬起一个名字。

1-4 用下标访问

不想解构时,也能用从 0 开始的下标直接取成员:

print("状态码 \(http404Error.0)")
print("描述 \(http404Error.1)")

http404Error.0 是第一个元素(404),.1 是第二个。下标方式写起来快,但可读性不如解构——别人得数着 0、1 才知道是哪个值。

1-5 给元素起名字

为了可读性,声明元组时可以直接给每个元素命名:

let http200Status = (statusCode: 200, description: "OK")

命名后,既可以用名字访问,也可以用下标访问,两者等价:

print("\(http200Status.statusCode)")      // 200
print("\(http200Status.description)")      // "OK"
print("\(http200Status.0)")               // 200,同样可用

起名后代码读起来像在说人话,“状态码""描述”一目了然,强烈推荐在语义重要的地方这么写。

1-6 作为函数的多返回值

元组最经典的用途,是让一个函数一次返回多个值。比如下面这个函数同时给出最小值和最大值:

func minMax(_ numbers: [Int]) -> (min: Int, max: Int) {
    // 内部算出最小和最大后一起返回
    return (numbers.min()!, numbers.max()!)
}
let result = minMax([3, 7, 2, 9])
print("最小 \(result.min),最大 \(result.max)")

函数返回类型写成 (min: Int, max: Int),调用方拿到的是一个带名字的元组,用 result.minresult.max 取用。比起只能返回一个值,元组让”返回一组相关结果”变得自然。

Tip

初学者常问:元组和后面要学的结构体(struct)有什么区别?一句话——元组适合”临时、轻量、就地使用”的组合;如果这组数据有名字、有行为、会反复出现,就该定义成 struct。元组用多了代码会散,别拿它当万能容器。

1-7 元组的类型匹配

元组的类型由”元素个数 + 各元素类型”共同决定。(Int, String)(String, Int) 是不同类型,(Int, Int)(Int, String) 也不同。这意味着你不能在要求某类型元组的地方,塞进元素类型对不上的另一个元组。

赋值时,只要两边元组结构一致(同名与否不影响,名字只是访问别名),就能互相赋值。解构、下标、命名三种访问方式可以混用,怎么顺手怎么来。

1-8 元组的定位

元组是 Swift 里最轻量的”打包”工具,但新手常低估它的定位。它擅长”临时、就地”把几个相关值捆一起,比如函数一次返回多个结果、或更替式里返回状态码加描述。一旦这组数据有名字、有行为、会反复出现,就该升级成结构体 struct,而非硬用元组。

解构、下标、命名三种取用方式,怎么顺手怎么来。但项目里我建议优先”命名元素”,可读性最高:(statusCode: 200, description: "OK")(200, "OK") 让调用方一眼懂。下标 元组.0 写快但读代码的人得数位置,团队代码里尽量少用。

元组类型由”元素个数 + 各元素类型”共同决定。(Int, String)(String, Int) 是不同类型,赋值时结构(含名字)一致才能互通。理解这点,你就不会在”明明都是两个值为啥不能赋值”上困惑。

一个实用提醒:元组不要嵌套太深。看到 (Int, (String, Bool), Double) 这种三层结构,基本说明你该定义结构体了。元组是便利贴,不是收纳柜,过度使用会让代码散、难维护。

函数多返回值是元组最经典的舞台。比起只能返回一个值,元组让”返回一组相关结果”自然得多。但记住,返回的若是固定两种相关信息,元组完美;若是更复杂的输出,考虑用结构体或后面学的可选类型来表达”可能没有结果”的情况。把元组当”临时组合”用,是它最舒服的姿态。享受它的轻,也别滥用它的轻。定位清楚了,元组会成为你写小程序、做实验时离不开的小帮手。

1-9 补记:失败场景的元组

再补一句使用建议:当函数要返回”可能失败”的多个信息时,元组配合可选值会更顺。比如返回 (data: Data?, error: Error?),调用方一眼看清”有数据还是有误”。不过一旦返回结构变复杂(超过三四个字段、或字段有行为),就该升级成结构体,别硬撑元组。元组是轻量便利贴,用在该用的地方最舒服。

记住它的定位——临时、就地、少量字段。超出这个边界,结构体才是正解。用对工具,代码自然又短又清楚。

1-10 小结

元组把多个(可不同类型的)值打包成一个复合值,适合临时组合相关数据。取用成员有三种方式:解构成独立变量、用下标 元组.0、或声明时命名后用名字访问。它最擅长让函数一次返回多个值。记住它的定位——轻量、临时的组合工具,复杂数据请交给结构体。下一章我们正式进入运算符,先从算术、赋值、取余说起。