Swift中的元组和函数参数

Boo*_*oon 5 tuples swift

在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)"中 - 这是参数列表中最常见的 - 你正在生成一个带有元素标签的元素元组.编译器目前正在努力消除它们并将它们降级为标量,但是如此不一致(这也是一个错误).那就是说,单元素标记的元组是一个东西.

GoZ*_*ner 4

每个函数都采用一个包含该函数参数的元组。这包括不带参数的函数,这些函数将()空元组作为其一个参数。

\n\n

以下是 Swift 编译器如何将各种括号形式转换为内部表示形式:

\n\n
() -> Void\n(x) -> x\n(x, ...) -> [Tuple x ...]\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且,如果有一个tuple?函数,它将在以下位置返回 true:Void, X, [Tuple x ...]

\n\n

这是你的证明:

\n\n
let 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

[大胆声明目前无法使用 Swift 解释器。]

\n\n

空速速度

\n\n
\n

但是等等,你会问,如果我传入元组以外的东西怎么办? \n 好吧,我回答(以一种深刻的哲学语气),如果不是一个元素的元组,那么变量到底是什么?Swift 中的每个变量都是一个 1 元组。事实上,每个非元组变量都有一个 .0 属性,它是该变量的值。4 打开一个 Playground 并尝试一下。因此,如果您将一个非元组变量传递到 TupleCollectionView 中,则它\xe2\x80\x99 是合法的\n,它就像一个集合一样。如果您不相信,请以听起来非常自信的人的声音再次阅读该理由。

\n
\n\n

记住当我们到达“我说土豆;我说土豆;”时的“哲学语气”。你说的土豆阶段。

\n

  • 检查[此](https://gist.github.com/robertvojta/8ce4ab72ad8a87d32c7f)。`oneSimple` 变为 `@_Tv4main9oneSimpleSi`,`oneTuple` 变为 `@_Tv4main8oneTupleSi`。根据 [Mike 的帖子](https://mikeash.com/pyblog/friday-qa-2014-08-15-swift-name-mangling.html),`Si` 是 `Swift.Int`。没有“T”(=元组)。仅适用于空元组 (`T_`) 或 2 个(或更多)元素 `TSiSi_`。`emptyTuple` 变为 `@_Tv4main10emptyTupleT_`,`twoTuple` 变为 `@_Tv4main8twoTupleTSiSi_`。 (2认同)