如何在swift中实现元组的命名值?

时间:2014-12-14 13:47:21

标签: scala swift pattern-matching tuples decompiling

在swift中,我们可以在 repl 中使用这样的元组:

 34> let person:(name:String,age:Int)=("Hello",23)
person: (name: String, age: Int) = {
  name = "Hello"
  age = 23
}
 35> person.name
$R13: String = "Hello"
 36> person.age
$R14: Int = 23

我没有为person明确定义类型,而String和Int的元组只有0和1的getter。

那么编译器如何知道person.name和person.age是合法的调用而person.something不是?

我问这个问题是因为我一直想要Scala类似的东西,但在Scala你只能这样做:

scala> val person=("Hello",23)
person: (String, Int) = (Hello,23)

scala> val (name,age)=person
name: String = Hello
age: Int = 23

我要么必须明确使用模式匹配,要么必须使用_1和_2方法。

好像没有反编译器我可以利用它来自己得到答案,所以我希望有知识的人可以提供帮助。

2 个答案:

答案 0 :(得分:1)

这是一个元组。在Swift中,没有命名参数的元组将允许通过.0,.1等进行访问。如果您为参数命名,那么它只是按名称查找它们,就好像它标记了每个参数一样。因为你是在声明时做的,所以元组的元素有名字,所以你可以通过名字来调用它们。这也是你无法调用尚未命名的参数的原因,例如.something。当你说“没有为某人定义类型”时,你实际上有;它是一个元组,定义为(String,Int)。

答案 1 :(得分:-1)

我不知道斯威夫特,但这看起来不像一个元组。它看起来像一个记录(aka结构)。记录中的字段具有名称,在元组中,它们不具有。