5.7 元组类型

元组(tuple)这个词很抽象,它是一种数据结构,在数学中应用广泛。在计算机科学中,元组是关系数据库中的基本概念,元组表中的一条记录,每列就是一个字段。因此在二维表里,元组也称为记录。

元组将多个相互关联组值合为单个值,便于管理和计算。元组内的值可以是任意类型,各字段类型不必相同。元组在作为函数返回多值时尤其有用。

假设我们要管理学生成绩,会定义一个Student元组,它包含学号(id)、姓名(name)、年龄(age)和分数(score)。那么使用Swift语法表示Student元组就是:

  1. ("1001", "张三", 30, 90)
  2. (id:"1001", name:"张三", age:30, score:90)

这两种写法都表示一个叫“张三”的学生的元组,但是第一种写法代码可读性不好,如果不进行说明,或许你能猜出“1001”代表学号,“张三”代表学生姓名,但30和90代表的含义是什么呢?而第二种写法一目了然,决不会引起困惑,显然代码可读性更好。通过“键-值对”表示更加直观,只不过要稍微多写一些代码。

下面我们来看一个示例:

  1. var student1 = ("1001", "张三", 30, 90)
  2. println("学生\(student1.1) 学号:\(student1.0) 年龄:\(student1.2),得分:\(student1.3)")
  3. var student2 = (id:"1002", name:"李四", age:32, score:80)
  4. println("学生\(student2.name) 学号:\(student2.id) 年龄:\(student2.age),
  5. 得分:\(student2.score)")
  6. let (id1, name1,age1,score1) = student1
  7. println("学生\(name1) 学号:\(id1) 年龄:\(age1),得分:\(score1)")
  8. let (id2, name2,_,_) = student2
  9. println("学生\(name2) 学号:\(id2)")

输出结果如下:

  1. 学生张三 学号:1001 年龄:30,得分:90
  2. 学生李四 学号:1002 年龄:32,得分:80
  3. 学生张三 学号:1001 年龄:30,得分:90
  4. 学生李四 学号:1002

上述代码第①行声明并初始化了元组类型的student1变量。第②行代码通过字段索引访问字段内容,其中student1.0访问student1的第一个字段,student1.1访问student1的第二个字段,依次访问下去,索引是从0开始的。

第③行代码声明并初始化了元组类型的student2变量,在这一行中采用了“键-值对”表示方式,为给每个字段定义一个名字,访问的时候比较方便。第④行代码通过字段名字访问其中内容,其中student2.name访问student2name字段,student2.id访问student2id字段。

第⑤行代码let (id1, name1,age1,score1) = student1事实上是对student1元组变量的分解,元组变量student1被分解为4个不同的变量中,因此我们在第⑥行代码打印输出"学生张三 学号:1001 年龄:30,得分:90"。有的时候我们并不想分解那么多变量,而是只需要学号和姓名,那么就可以使用第⑦行代码的方式,把不需要的字段使用下划线(_)替代。第⑧行代码输出结果是"学生李四 学号:1002"