元组 (Tuple) 可能是你从 ObjC 迁移到 Swift 时, 遇到的第一个没有 "原型" 的概念, 由于使用元组时, 有一系列在 ObjC 看来匪夷所思的语句出现, 让我们先来看看元组的样子长什么样:
声明
var aTuple = (10, "Xishi")
最简单的元组, 就是在圆括号中, 用逗号分割的一组值.
元素带名称的元组:
var aTuple = (index: 10, name: "Xishi")
元组有以下特点:
一旦声明, 可以改值, 但不能添加 / 删除元素
不能更改已经声明的元素名称
已声明的名称可以省略, 但未声明名称的元组, 不可添加名称:
- var aTuple = (10, "Xishi") // 未声明名称
- aTuple = (10, name:"Xishi") // 后期添加名称, 可行但无效
- aTuple.name // 错误
取值
要取用元组中的值, 针对声明时是否有元素名称, 有两种取值方法,
通用方法, 使用下标:
- aTuple.0 // == 10
- aTuple.1 // == "Xishi"
已命名的元组, 可使用名称:
- aTuple.index
- aTuple.name
还可以直接分拆成常量 / 变量:
- let (x, y) = aTuple
- x // == 10
- y // == "Xishi"
- var (a, b) = aTuple
- a // == 10
- b // == "Xishi"
取值时可以指定类型, 加强类型判断:
- let (x, y): (Int, Int) = (1, 2) // 正确
- let (x, y): (Int, Int) = aTuple // 错误, 因为第二个值声明为 String, 与 Int 不相符
不想处理的值, 可以用下划线_代替(大概是设计者体恤我们想变量名的痛苦吧):
let (x, _) = aTuple
应用
作为函数参数
- func foo(_ args: (Int, Int, String)) -> Int {
- return args.0
- }
- let arguments = (4, 3, "hello")
- foo(arguments) // 返回 4
作为函数返回值
利用元组, 从函数中返回多个值:
- func abc() -> (Int, Int, String) {
- return (3, 5, "Xishi")
- }
- let (a, b, c) = abc()
通过以上介绍, 你对元组应该有些概念了, 由于相对 ObjC 来说, 元组比较陌生, 本文刻意避免提到结构体, 数组, 字典, 枚举等常见组合类型, 希望你能先忘记这些熟悉的概念, 仔细体会文中提到的使用方法, 避免在开发时陷入不必要的误区中.
来源: http://www.jianshu.com/p/938972e28fbd