【发布时间】:2015-07-09 14:37:53
【问题描述】:
在 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")
}
在常规函数(而不是返回函数)中在函数参数中声明元组时,行为也存在不一致:
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")
更新:
Chris Lattner 对元组的澄清:
"x.0" 其中 x 是一个标量值产生该标量值,由于奇 涉及标量和标量之间过度隐式转换的行为 元组。这是一个待修复的错误。
在“let x = (y)”中,x 和 y 具有相同的类型,因为 (x) 是 括号(即分组)运算符的语法,而不是元组 编队运算符。没有单一元素这样的东西 未标记的元组值。
在“(foo: 42)”中——最常见于参数列表中—— 您正在生成一个带有元素标签的单个元素元组。 编译器目前正在努力消除它们并降级 它们是标量,但不一致(这也是一个错误)。 也就是说,单元素标记的元组是一回事。
【问题讨论】:
-
在这个函数
func funcUsingTuple(x:(Int, String))中你必须明确地传递一个元组:funcUsingTuple((1, "test")) -
@Antonio 是的,我已经注意到了。问题是为什么当从函数返回相同的确切函数时我不需要做同样的事情? (见前面的例子)
-
@Boon,说真的,甚至连对相关讨论的每个实质性答案都投赞成票?
-
@GoZoner 感谢您的提醒,仍在进行中的积极讨论。赞成你的答案。尚未选择答案,因为没有答案涵盖问题的第二部分。