Swift语言指南(八)--语言基础之元组
元组
元组(Tuples)将多个值组合为一个复合值。元组内的值可以是任何类型,各个元素不需要为相同类型(各个元素之间类型独立,互不干扰--Joe.Huang)。
下例中,(404, "Not Found") 是一个描述HTTP状态码的元组。HTTP状态码是当你向WEB服务器请求页面时服务器返回的一个特殊值,如果你(向WEB服务器)请求了一个不存在的网页,返回的状态码就是 404 Not Found :
1 let http404Error = (404, "Not Found") 2 // http404Error is of type (Int, String), and equals (404, "Not Found") 3 // http404错误的类型为(整型,字符串类型),它的值是(404,"Not Found")
(404, "Not Found") 元组将一个 Int 值与一个 String 值组合起来,表示 HTTP 状态码的两个值:一个数字和一个人们可读取的(文字性)描述。它可以这样理解:“一个类型为 (Int, String) 的元组”。
你可以将类型任意排列来创建元组,也可以随心所欲地让元组包含多种不同类型。只要你愿意,创建类型为 (Int, Int, Int) 或 (String, Bool) 的元组也不会有问题,当然,根据你的需要,其它排列方式也是可以的。
元组的内容可以分解(decompose)还原并赋值给单独的常量或变量,然后便可照常访问:
1 let (statusCode, statusMessage) = http404Error 2 println("The status code is \(statusCode)") 3 // prints "The status code is 404" //输出“状态码为 404” 4 println("The status message is \(statusMessage)") 5 // prints "The status message is Not Found //输出"状态信息 Not Found"
如果你只需要元组的某一部分值,可以在分解元组时用下划线(_)标识来忽略掉其他部分:
1 let (justTheStatusCode, _) = http404Error 2 println("The status code is \(justTheStatusCode)") 3 // prints "The status code is 404 //输出“状态码为 404”
或者,通过以 0 开头的元组索引访问元组的各个元素值:
1 println("The status code is \(http404Error.0)") 2 // prints "The status code is 404" //输出“状态码为 404” 3 println("The status message is \(http404Error.1)") 4 // prints "The status message is Not Found //输出“状态码为 Not Found”
5 //这种方式类似于数组通过下标索引访问数组各个元素的值--Joe.Huang
还可以在定义元组时为元组的各个元素单独命名:
1 let http200Status = (statusCode: 200, description: "OK")
为元组各元素命名后,便可以通过元素名称来访问各个元素的值了:
1 println("The status code is \(http200Status.statusCode)") 2 // prints "The status code is 200" //输出“状态码为 404” 3 println("The status message is \(http200Status.description)") 4 // prints "The status message is OK //输出“状态信息 OK”
元组在作为函数返回值时非常有用。一个获取网页内容的函数可能会通过返回一个 (Int, String) 的元组类型来描述网页载入是成功还是失败。函数会返回两个类型完全不同的值来描述返回的状态或结果,(这种返回方式)所能提供的信息比只能返回固定类型的单个值要有用得多。详情请参见 多个返回值的函数(后面章节会译到)。
注:
元组对于多个关联值的临时组合是很有用的。但它们并不适用于创建复杂的数据结构,如果你的数据结构的生命周期超过临时使用的范畴(不是临时使用的值,就应该通过类或建模缓存起来--Joe.Huang),请将它作为类或结构建模,而不是以元组存储。详情请见 类与结构(后面章节会译到)。
谢谢,Swifter-QQ群:362232993,同好者进~
Fork:https://github.com/Joejo/Swift-lesson-for-chinese