元组是swift编程语言中唯一的一种复合类型,他可以将指定有限个数的任何类型一次整理为一个对象,元组中的每一种类型都可以是任何的结构体、枚举或类类型,甚至也可以是一个元组以及空元组。元组中的每个元素我们称为一个“分量”
eg:
enum MyEnum {
case one, two, three
}
class MyClass {
var member = 0
}”
第一节:访问元组中的元素
如果我们要访问元组中的元素,可以使用成员访问操作符 . ,后面跟元素的索引位置(从0开始计)
eg:
//声明一个元组常量tuple,类型为(Int, Double, Bool)
let tuple = (10, 0.5, false)
//访问元组中的第一个元素
//这里的常量a的值为10
let a = tuple.0
我们也可以给元组指定标签,通过访问标签来访问元素
eg:
//声明一个元组常量tuple,其类型为:(int: Int, double: Double,bool: Bool)
let tuple = (int: 10, double: 0.5, bool: false)
//访问元组中的第一个元素
//这里的常量a的值为10
let a = tuple.int
注意: 一旦一个元组的某个元素带上标签,那么该元组类型相应的位置上也必须加上标签,一个元组中不需要给所有的元素都加上标签,可以加一部分,指定标签的元素,我们可以通过索引位置访问也可以通过标签访问; 元组往往用于一个函数返回多个不同类型的对象的场合。
第二节:元组分解
我们能很容易的定义一个元组对象,我们也可以很容易的同时萃取一个元组中的相应元素,这也被称为元组分解。
我们在做元组分解时,将几个变量或常量以元组定的方式声明出来,然后=右边元组相应的元素就能赋值给=左边相应的变量或常量了。
eg:
// 声明一个元组常量tuple
let tuple = (10, 0.5, true)
//这里同时声明三个常量:a, b, c
//tuple的第一个元素对 a 初始化,b, c同理
let (a, b, c) = tuple
// 如果我们不想萃取元组中的某个元素,用_代替
// a的值为:5.5, c的值为:false
let(a, _, c) = (5.5, "hello", false)
// 因为元组分解这一语法特性,可以通过元组字面量来交换两个对象的值
// 定义 a和b两个Int类型对象
var a = 1, b = 2
// 交换两个对象的值,a = 2, b = 1
(a, b) = (b, a)
注意:上面代码 let (a, b, c) 不是在声明元组,而是同时声明三个常量,用于萃取一个元组中的值,元组也可以看作一个对象,上面的tuple就是名副其实的一个元组对象
第三节:元组比较
两个相同元素类型的元组,如果每个元素都遵循了Equatable协议,那么这两个元组可以用==, !=操作符来判断两者是否相等,如果两个元组中的每个元素的值对应都相等,则这两个元组对象相等,否则不等。
eg:
let t1 = (1, 2, 3)
let t2 = (1, 2, 3)
//判断元组 t1和t2 是否相等,结果为:true
print("t1 == t2? \(t1 == t2)")
如果每个元素都遵循Comparable协议,那么这两个元组可以用<, <=, >, >=操作符来比较,从第一个元素开始比较,有结果立即返回结果,否则依次进行比较下去。
eg:
let t3 = (6, 9, 3, 4)
let t4 = (6, 2, 5, 8)
//判断元组 t3和t4 是否为小于关系,结果为:false
//因为t3的第二个元素大于t4的第二个元素
print("t3 < t4? \(t3 < t4)")
注意:这里t1和t3比较,会直接报错,因为不属于同一个类型
eg:
let t5 = (true, 9, 3, 4)
let t6 = (false, 2, 5, 8)
这里的t5和t6比较也会报错,虽然元组类型一样,因为Bool类型不遵循comparable协议