tuple 介绍
在编程语言的类型理论中,tuple元组是product类型。对于Objective-C开发人员而言,元组类型有些陌生,但是对于Python开发者来说tuple非常熟悉。tuple类型是用括号括起来的零个或多个类型的逗号分隔列表。
tuple是其他不同类型的化合物。tuple元组可以包含零个或多个类型,通常是String,Integer,Bool以及其他元组。另外请注意,元组是通过值而不是引用传递的。
在编程语言和类型理论中,product是一种复合类型。product的操作对象是各种类型,product结构由product中操作对象的固定顺序确定。product的实例保留固定顺序,,实例的表达式将是一个元组,称为表达式的“元组类型”。在许多语言中,product类型采用记录类型的形式,为此,可以通过标签访问元组的组件。
tuple 基础使用
tuple初始化
let foo = (0, false, “Hello”)
上面是一个包含三个独立元素的元组类型,如果我们在元组声明中很冗长,则将上面的元组定义为:
let foo: (Int, Bool, String) = (0, false, “Hello”)
tuple访问
print(foo.0) // print: “0”
print(foo.1) // print: “false”
print(foo.2) // print: “Hello”
tuple设置数值
var product = (iphone: "X", price: 1000)
print(product) //(iphone: "X", price: 1000) //current value
product.price = 1200 //Change value
print(product) //(iphone: "X", price: 1200) // updated value
tuple混合使用
希望到现在为止您已经对tuple语法有了很好的了解,下面我们将通过创建一个复杂的tuple让大家深入理解。
let bar: (Int, (Bool, String)) = (1, (false, “Hello”))
print(bar.0) // print: “0”
print(bar.1.0) // print: “false”
print(bar.1.1) // print: “Hello”
上面是点式访问,我们下面看看通过标签访问
let person = (age: 28, isTall: false, name: “Andyy”)
print(person.age) // print: “28”
print(person.isTall) // print: “false”
print(person.name) // print: “Andyy”
什么时候使用tuple呢
使用元组的最佳位置是当您想要一个可以返回多种类型的函数时。如果您是Objective-C开发人员,那么这个概念听起来有些古怪,甚至可能是不可能的。以前,我们必须通过返回NSArray或NSDictionary来克服此类问题。但是即使是这样的决议也可能很危险。因为如果我们尝试类型转换NSArray的错误对象并在其上调用特定函数该怎么办?这可能会在运行时造成崩溃。
因此,让我们看一下如何使函数返回多个值,而不是针对Objective-C的局限性而提出速成hacky解决方案:
提高代码可读性
typealias Person = (age: Int, isTall: Bool, name: String)
func getMultipleValues() -> Person {
let person: Person = (age: 28, isTall: false, name: “Andyy”)
return person
}
let andyy = getMultipleValues()
print(andyy.age) // print: "28"
print(andyy.isTall) // print: "false"
print(andyy.name) // print: "Andyy"
为了提高代码的可读性,我使用了类型别名来预定义元组的结构,也许您也应该在代码中使用它,以防止您在整个代码中意外地错误地重新定义其结构。
但是正如您在上面看到的那样,有一个函数调用getMultipleValues(),该函数返回三个独立且不同的数据类型的元组,每种类型都有其自己的对应变量名。
函数式调用
func getPhoneInfo() -> (name: String, price: Float){
return (name: "iPhone X", price: 1000)
}
//Output
getPhoneInfo().name // "iPhone X"