最近看 iOS 的官方功能的 Demo 时,发现代码中使用元组的地方很多,所以兴趣上来,查了下元组的出处。
在苹果的文档中就只有简短的两句,使用元组创建一个组合的值,从函数中返回多个值。元组中的可以使用属性值或者索引引用。
Apple Documentation
Use a tuple to make a compound value, to return multiple values from a function. The elements of a tuple can be referred to either by name or by number.
语句越是简短,传达的信息越是多啊,在查找其他大佬对元组的介绍时,比较认同其中一个大佬的理解:把元组看作是微型 Struct 或者 Struct List,应该在最小的范围内使用,然后被释放。也就是元组是值传递,而不是引用。
元组包括 String
、Integer
、Bool
,甚至是元组类型都可以:
// 创建元组
let foo = (0, false, 'Hello')
也可以在创建元组时,定义值类型:
let foo: (Int, Bool, String) = (0, false, 'Hello')
在使用的时候可以通过索引获取:
print(foo.0) // print: "0"
print(foo.1) // print: "false"
print(foo.2) // print: "Hello"
也可以通过属性值去获取值:
// 创建元组
let person = (age: 20, isTall: false, name: "tam")
print(person.age) // print: "20"
print(person.isTall) // print: "false"
print(person.name) // print: "tam"
哪里可以使用元组?
当函数需要返回多个不同类型的值时,是使用元组最好的时候。可以使用 typealias
去定义一个元组类型,并给到函数处理,比如下面代码:
typealias Person = (age: Int, isTall: Bool, name: String)
func getMultipleValues() -> Person {
let person: Person = (age: 20, isTall: false, name: "tam")
return person
}
let person = getMultipleValues()
print(person.age) // print: "20"
print(person.isTall) // print: "false"
print(person.name) // print: "tam"
发现
如果使用 Swift 开发时,也在不知不觉中接触到元组,先看下面三个函数:
func functionA() -> Void { }
func functionB() -> () { }
func functionC() { }
functionA()
是创建函数的标准样式,functionB
的返回值是元组 ()
,functionC()
通过完全省略返回类型。
由此可推断,typealias Void = ()
,实际上就是一个空的元组。所以,元组也可以是空的。
题外话
时间仓促,说的东西可能不全面,在你实现过程中遇到什么问题,评论区给我留言,我会尽快回复