_:vs _ St​​ring的区别/用例是什么:写函数时

时间:2017-01-31 21:50:27

标签: swift syntax structure

我正在快速学习,_符号给我带来了很多麻烦。在苹果书“迅速开发应用程序”第15课中,我们学习构建结构。我试图理解使用_:来表示一个未命名的参数和使用_ String:来表示某些东西(可能是另一个未命名的参数,但我们给它一个名字?)

这是我的示例代码:

    struct Rectangle {
        let width: Int
        let height: Int
        var area: Int {
            return width*height
        }

func biggerThan(_ rectangle: Rectangle) -> Bool {
    return area > rectangle.area
    }
}

与我的主要问题一样,我不明白为什么这个函数在不改变代码返回行的情况下可以写成(_ rectangle: Rectangle)(_:Rectangle)

1 个答案:

答案 0 :(得分:3)

可能是您遇到了Swift版本问题。在Swift 3中,需要两种语法之一:

func foo(bar:String, bar2:Int) {
}

func foo(_ bar:String, bar2:String) {
}

func foo(bar:String, _ bar2:String) {
}

func foo(_ bar:String, _ bar2:Int) {
}

对此函数的相应调用是:

foo(bar: "Hello World", bar2: 1)
foo("Hello World", bar2: 1)
foo(bar: "Hello World", 1)
foo(bar: "Hello World", 1)

也就是说,签名中的下划线表示您未在通话中声明它。

但是在所有以前版本的Swift中,第一个参数都有一个隐含的下划线,进行相应的调用:

foo("Hello World", bar2: 1)
foo("Hello World", bar2: 1)
foo("Hello World", 1)
foo("Hello World", 1)

另请注意,虽然您可以将下划线视为明确声明不使用名称,但您也可以重命名

foo(bar myBar:String, bar2 myBar2:Int) {
    // internally refer to myBar and myBar2, not bar and bar2
}

电话是:

foo(bar: "Hello World", bar2: 1)