Swift - Tuple
相比于 Objective-C ,Swift 提供了一种新的类型 Tuple , Tuple可以创建一组不同类型的集合。
例如需要返回一个 HTTP 状态信息 :
- 状态码 : 200 ; 状态消息 : SUCCESS
- 状态码 : 404 ; 状态消息 : File not found
定义一个 Tuple
定义一个 HTTP 状态消息
1 | //: #### Define a tuple |
定义一个指定命名的Tuple
1 | let userInfo = (name: "jianxiong", age: 22, email: "jianxiong1997@gmail.com") |
定义好之后 ,就可以通过下面的方式访问 Tuple 中的数据成员
1 | success.0 //200 |
Tuple Decomposition
把一个 Tuple 的值 ,一一拆分到不同的变量上 ,叫做 Tuple Decomposition 。
1 | //: #### Tuple Decomposition |
这里使用success 构建了一个新的 Tuple ,因此修改 successCode 和 successMessage 都不会对原有的 success 产生影响
1 | successCode = 201 |
如果只是想要对应到 Tuple 中特定的成员 ,忽略其他成员 , 可以采用 _ 来表示忽略的成员 , 例如
1 | let (_ ,errorMessage) = fail |
Tuple Type
每一个 Tuple 的类型 , 都是有 Tuple 中所有成员决定的 。 例如 success 的类型 就是 (Int ,String) 。 当我们需要用 Type annotation 定义一个 Tuple 时 , 我们可以这样写。这里不能通过指定命名来取值了
1 | var airPodsInfo:(String ,Double ,String) = (name: "商品名称" ,money: 1168.8 ,mode: "A2031") |
Tuple comparison
当我们比较两个Tuple类型的变量时,要遵循下面的规则:
首先,只有元素个数相同的Tuple变量之间,才能进行比较。例如,下面的代码会引发编译错误:
1 | let tuple1 = (1,2,3) |
从上面的结果就能看到,包含两个Int的Tuple不能和包含三个Int的Tuple进行比较。
其次,当Tuple中元素个数相同时,比较是按照Tuple中元素的位置从前向后依次进行的:
- 如果Tuple中,相同位置的两个元素相等,则继续比较下一个位置的两个元素,并根据第一个同一位置不相等的两个元素的大小关系,确定两个Tuple变量的关系;
- 如果两个Tuple中所有位置的元素都相等,则两个Tuple变量相等;
1 | let tuple1 = (1,3) |
需要注意下 tuple 最多包含6个元素的Tuple变量进行比较,超过这个数量,Swift会报错
1 | let tuple1 = (1,3,34,123,135,244,2) |