美文网首页
1.3.Swift 3使用Tuple打包数据

1.3.Swift 3使用Tuple打包数据

作者: CDLOG | 来源:发表于2018-12-25 14:20 被阅读0次

很多时候,我们需要把多个不同类型的值,打包成一个单位处理。例如,返回一个HTTP状态信息:

  • 状态码: 200; 状态消息: HTTP OK
  • 状态码: 404; 状态消息: File not found

或者,返回一条数据库用户信息记录:姓名: Mars; 工号: 11; 电子邮件: 11@boxue.io。在Swift里,我们可以使用Tuple 来很方便的处理类似的问题。

定义一个Tuple

我们使用下面的方式,来定义一个Tuple:

(value1, value2, value3...)

例如,定义我们开始提到的HTTP状态码:

//: #### Define a tuple

let success = (200, "HTTP OK")
let fileNotFound = (404, "File not found")

我们还可以给Tuple中的每一个数据成员指定一个名字,例如,定义一个表达用户信息记录的Tuple:

(name1: value1, name2: value2, name3: value3...)

//: #### Define a tuple
let me = (name: "Mars", no: 11, email: "11@boxue.io")

访问Tuple中的数据成员

定义好Tuple之后,我们可以使用下面的方式访问Tuple中的数据成员:

//: #### Access tuple content

success.0
success.1

fileNotFound.0
fileNotFound.1

如果我们在定义Tuple时,指定了Tuple成员的名字,我们就可以像下面这样访问这些数据成员:

//: #### Access tuple content

me.name
me.no
me.email

Tuple Decomposition

我们在定义Tuple的时候,还可以把一个Tuple的值,一一对应的拆分到不同的变量上,这叫做Tuple Decomposition。例如,对于之前定义过的success,我们可以这样定义一个新的Tuple:

var (successCode, successMessage) = success

print(successCode) // 200
print(successMessage) // HTTP OK

之后,就可以直接访问successCodesuccessMessage的值了。这可以提高我们处理Tuple成员时的代码可读性。但要说明的是,我们这里是使用success的值,构建了一个新的Tuple,因此修改succeCodesuccessMessage的值,不会影响到原来的success

例如,我们修改successCode

successCode = 201

success // (200, "HTTP OK")

从结果我们可以看到,之前的success的值没有被修改。另外,如果我们只是想对应到Tuple中特定的成员,而忽略其它成员,我们可以使用下划线'_'来代表那些不需要被对应的成员。例如:

let (_, errorMessage) = fileNotFound
print(errorMessage)

Tuple type

每一个Tuple的类型,都是由Tuple中所有数据成员一起决定给的。例如,对于一开始我们定义的success和me,它们的类型就分别是:(Int, String)(String, Int, String)。当我们需要用type annotation定义一个Tuple的时候,我们可以这样写:

var redirect: (Int, String) = (302, "temporary redirect")

Tuple comparison

当我们比较两个Tuple类型的变量时,要遵循下面的规则:

首先,只有元素个数相同的Tuple变量之间,才能进行比较。例如,下面的代码会引发编译错误:

let tuple12 = (1, 2)
let tuple123 = (1, 2, 3)

tuple2 < tuple3

tuple compare error

从上面的结果就能看到,包含两个Int的Tuple不能和包含三个Int的Tuple进行比较。

其次,当Tuple中元素个数相同时,比较是按照Tuple中元素的位置从前向后依次进行的:

  • 如果Tuple中,相同位置的两个元素相等,则继续比较下一个位置的两个元素,并根据第一个同一位置不相等的两个元素的大小关系,确定两个Tuple变量的关系;
  • 如果两个Tuple中所有位置的元素都相等,则两个Tuple变量相等;

因此,对于下面这个例子,tuple11 < tuple12的结果是true

let tuple11 = (1, 1)
let tuple12 = (1, 2)

tuple11 < tuple12 // true

但是,有一点要说明的是,我们只可以对最多包含6个元素的Tuple变量进行比较,超过这个数量,Swift会报错。例如对于下面这段代码:

let largeTuple1 = (1, 2, 3, 4, 5, 6, 7)
let largeTuple2 = (1, 2, 3, 4, 5, 6, 7)

largeTuple1 == largeTuple2 // Error !!!

编译器就会提示类似下面这样的错误:

tuple compare error

相关文章

  • 1.3.Swift 3使用Tuple打包数据

    很多时候,我们需要把多个不同类型的值,打包成一个单位处理。例如,返回一个HTTP状态信息: 状态码: 200; 状...

  • pydantic 拆包解包

    打包 tuple 打包 dict 解包 可选数据类型

  • (五) [Swift]Swift中的Tuple数据类型

    1.什么是Tuple Tuple就是对数据进行打包,然后进行访问。是多个值组成的符合类型。 2.Tuple定义 3...

  • Python学习笔记(1)

    Python (1)数据类型和变量 (2)字符串和编码 (3)使用List和tuple (4)条件判断 (5)循环...

  • torch.size(), torch.view(),torch

    博客参考 1.torch.size()的实质上是tuple 输出: 5 3注: 可以使用tuple的基本操作,获取...

  • storm trident State

    State 是用来 管理 从数据存储中 查询数据(使用batch中的tuple作为输入来查询) 插入和更新数据(把...

  • go sqlite3 打包 gcc 问题

    使用 _ "github.com/mattn/go-sqlite3" 操作sqlite数据库,打包的时候报错,关于...

  • Tuple

    Tuple是一种小巧的数据容器,声明的时候为不同的元素指定类型,取出时使用get或得对应元素: Tuple 的初始...

  • Hive--topN求解/修改HS2端口/高性能刷新分区数据

    一、topN求解 1、导入数据 2、使用json_tuple函数解析json 3、做成大宽表在生产上一般来说是要将...

  • 元组

    tuple与list类似,区别在于tuple中的元素无法修改 定义tuple 使用 () 来定义tuple 可以把...

网友评论

      本文标题:1.3.Swift 3使用Tuple打包数据

      本文链接:https://www.haomeiwen.com/subject/uvtlkqtx.html