Swift中Tuple的底层类型

Boo*_*oon 2 swift

Swift中Tuple的基础类型是什么?我在Swift模块中看到一个提到Tuple但我不能满足以下任何一个:

var x: Tuple
var y: Optional<Tuple>
Run Code Online (Sandbox Code Playgroud)

Tuple是Swift中的编译器魔法还是实际类型?

Gab*_*lla 8

声明

let x: Tuple
Run Code Online (Sandbox Code Playgroud)

由于两个原因没有意义:

  • 缺少元组基数(见下文)
  • 缺少参数类型

这几乎就像声明一样

let x: Array
Run Code Online (Sandbox Code Playgroud)

这也是禁止的(缺少参数类型)

这里的不同之处还在于Tuple它本身不是一种类型.元组类型由它所包含的元素的类型和它们的数量来定义.

所以Tuple类型没有意义,而是你会有几种类型Tuple2,Tuple3依此类推.每个TupleX都有X类型参数,一旦提供,将定义具体类型.

在swift中,编译器为你创建了这个类型(我没有引用它,但它是我能做的唯一合理的假设),可能达到有限数(我还没有找到).这种类型的命名看起来并不明确,所以你找不到Tuple2,但你会有一个($T1, $T2)类型.

总结一下,Tuple由于几个原因,声明一个参数是没有意义的,但你肯定会有类似的东西

var x: (Int, String)
Run Code Online (Sandbox Code Playgroud)

要么

var y: Optional<(Int, String)>
Run Code Online (Sandbox Code Playgroud)

等等.

为了进一步澄清我的观点,这就是为什么Tuple2并且Tuple3需要两种不同的类型:

class Tuple2<T1,T2> {
    init (_ e1: T1, _ e2: T2) {}
}

class Tuple3<T1,T2,T3> {
    init (_ e1: T1, _ e2: T2, _ e3: T3) {}
}

Tuple2(1, "string")
Tuple3(1, "string", ["an", "array"])
Run Code Online (Sandbox Code Playgroud)

这可能与编译器生成的类似,您可以很容易地看到每个都TupleX采用不同数量的类型参数,因此我们需要为每个X定义一个类型.