在Swift中,元组与函数参数有什么关系?
在以下两个示例中,函数返回相同的类型,即使一个采用元组而另一个采用两个参数.从调用者的角度来看(没有窥视代码),函数是否采用元组或常规参数没有区别.
函数参数在某些方面与元组有关吗?
例如
func testFunctionUsingTuple()->(Int, String)->Void {
func t(x:(Int, String)) {
print("\(x.0) \(x.1)")
}
return t
}
func testFuncUsingArgs()->(Int, String)->Void {
func t(x:Int, y:String) {
print("\(x) \(y)")
}
return t
}
do {
var t = testFunctionUsingTuple()
t(1, "test")
}
do {
var t = testFuncUsingArgs()
t(1, "test")
}
Run Code Online (Sandbox Code Playgroud)
在常规函数(而不是返回函数)中声明函数参数中的元组时,行为也存在不一致:
func funcUsingTuple(x:(Int, String)) {
print("\(x.0) \(x.1)")
}
func funcUsingArgs(x:Int, _ y:String) {
print("\(x) \(y)")
}
// No longer works, need to call funcUsingTuple((1, "test")) instead
funcUsingTuple(1, "test")
funcUsingArgs(1, "test3")
Run Code Online (Sandbox Code Playgroud)
更新:
Chris Lattner对元组的澄清:
"x.0",其中x是标量值,由于奇怪的行为涉及标量和元组之间过多的隐式转换,因此产生标量值.这是一个需要修复的错误.
在"let x =(y)"中,x和y具有相同的类型,因为(x)是括号(即分组)运算符的语法,而不是元组形式运算符.没有单个 - 元素未标记的元组值.
在"(foo:42)"中 - 这是参数列表中最常见的 - 你正在生成一个带有元素标签的元素元组.编译器目前正在努力消除它们并将它们降级为标量,但是如此不一致(这也是一个错误).那就是说,单元素标记的元组是一个东西.
每个函数都采用一个包含该函数参数的元组。这包括不带参数的函数,这些函数将()空元组作为其一个参数。
以下是 Swift 编译器如何将各种括号形式转换为内部表示形式:
\n\n() -> Void\n(x) -> x\n(x, ...) -> [Tuple x ...]\nRun Code Online (Sandbox Code Playgroud)\n\n并且,如果有一个tuple?函数,它将在以下位置返回 true:Void, X, [Tuple x ...]。
这是你的证明:
\n\nlet t0 : () = ()\nt0.0 // error\n\nlet t1 : (Int) = (100)\nt1.0 -> 100\nt1.1 // error\n\nlet t2 : (Int, Int) = (100, 200)\nt2.0 -> 100\nt2.1 -> 200\nt2.2 // error\nRun Code Online (Sandbox Code Playgroud)\n\n[大胆声明目前无法使用 Swift 解释器。]
\n\n从空速速度
\n\n\n\n\n但是等等,你会问,如果我传入元组以外的东西怎么办? \n 好吧,我回答(以一种深刻的哲学语气),如果不是一个元素的元组,那么变量到底是什么?Swift 中的每个变量都是一个 1 元组。事实上,每个非元组变量都有一个 .0 属性,它是该变量的值。4 打开一个 Playground 并尝试一下。因此,如果您将一个非元组变量传递到 TupleCollectionView 中,则它\xe2\x80\x99 是合法的\n,它就像一个集合一样。如果您不相信,请以听起来非常自信的人的声音再次阅读该理由。
\n
记住当我们到达“我说土豆;我说土豆;”时的“哲学语气”。你说的土豆阶段。
\n| 归档时间: |
|
| 查看次数: |
2210 次 |
| 最近记录: |