Swift中Tuple的底层类型

时间:2014-06-26 11:34:28

标签: swift

Swift中Tuple的基础类型是什么?我在Swift模块中看到一个提到Tuple的内容,但我不能做以下任何事情:

var x: Tuple
var y: Optional<Tuple>

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

4 个答案:

答案 0 :(得分:8)

声明

let x: Tuple
由于两个原因,

没有意义:

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

它几乎就是声明

let x: Array

也被禁止(参数类型缺失)

这里的区别还在于Tuple本身不是一种类型。元组类型由它所包含的元素的类型和它们的数字定义。

因此Tuple类型没有意义,相反,您会有多种类型Tuple2Tuple3等等。每个TupleX都有X个类型参数,这些参数将定义一旦提供的具体类型。

在swift中,编译器会为你创建这些类型(我没有参考,但它是我能做出的唯一合理的假设),可能达到有限数量(我仍然没有?)找到)。这些类型的命名看起来并不明确,因此您无法找到Tuple2,但您将拥有($T1, $T2)类型。

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

var x: (Int, String)

var y: Optional<(Int, String)>

等等。

为了进一步澄清我的观点,这里为什么Tuple2Tuple3需要两种不同的类型:

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"])

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

答案 1 :(得分:0)

根据Apple的Swift书: 元组将多个值分组为单个复合值。元组中的值可以是任何类型,并且不必彼此具有相同的类型。

答案 2 :(得分:0)

我认为它就像.net中的匿名类型

例如,在C#中,您可以执行以下操作

var v = new { Amount = 108, Message = "Hello" }

就像在Swift Tuple中一样。

因此,我认为这很可能是编译器的魔力。

答案 3 :(得分:0)

这只是一个有根据的猜测,但发生的事情可能是编译器将元组视为通用元组类(或结构)的实例。这就是Scala处理元组的方式。