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"