Swift中Tuple的基础类型是什么?我在Swift模块中看到一个提到Tuple的内容,但我不能做以下任何事情:
var x: Tuple
var y: Optional<Tuple>
Tuple是Swift中的编译器魔法还是实际类型?
答案 0 :(得分:8)
声明
let x: Tuple
由于两个原因,没有意义:
它几乎就是声明
let x: Array
也被禁止(参数类型缺失)
这里的区别还在于Tuple
本身不是一种类型。元组类型由它所包含的元素的类型和它们的数字定义。
因此Tuple
类型没有意义,相反,您会有多种类型Tuple2
,Tuple3
等等。每个TupleX
都有X
个类型参数,这些参数将定义一旦提供的具体类型。
在swift中,编译器会为你创建这些类型(我没有参考,但它是我能做出的唯一合理的假设),可能达到有限数量(我仍然没有?)找到)。这些类型的命名看起来并不明确,因此您无法找到Tuple2
,但您将拥有($T1, $T2)
类型。
总结一下,声明一个Tuple
参数由于几个原因没有意义,但你肯定会有类似的东西
var x: (Int, String)
或
var y: Optional<(Int, String)>
等等。
为了进一步澄清我的观点,这里为什么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"])
这可能类似于编译器生成的内容,您可以很容易地看到每个TupleX
采用不同数量的类型参数,因此我们需要为每个X定义一个类型。
答案 1 :(得分:0)
根据Apple的Swift书: 元组将多个值分组为单个复合值。元组中的值可以是任何类型,并且不必彼此具有相同的类型。
答案 2 :(得分:0)
我认为它就像.net中的匿名类型
例如,在C#中,您可以执行以下操作
var v = new { Amount = 108, Message = "Hello" }
就像在Swift Tuple中一样。
因此,我认为这很可能是编译器的魔力。
答案 3 :(得分:0)
这只是一个有根据的猜测,但发生的事情可能是编译器将元组视为通用元组类(或结构)的实例。这就是Scala处理元组的方式。