在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方法。
好像没有反编译器我可以利用它来自己得到答案,所以我希望有知识的人可以提供帮助。
答案 0 :(得分:1)
这是一个元组。在Swift中,没有命名参数的元组将允许通过.0,.1等进行访问。如果您为参数命名,那么它只是按名称查找它们,就好像它标记了每个参数一样。因为你是在声明时做的,所以元组的元素有名字,所以你可以通过名字来调用它们。这也是你无法调用尚未命名的参数的原因,例如.something。当你说“没有为某人定义类型”时,你实际上有;它是一个元组,定义为(String,Int)。
答案 1 :(得分:-1)
我不知道斯威夫特,但这看起来不像一个元组。它看起来像一个记录(aka结构)。记录中的字段具有名称,在元组中,它们不具有。