1

我正在通读 Swift 2.2 man 并试图理解 mutating fun 部分中的一个函数,这里是代码

struct TestPoint {
    var x = 0.0, y = 0.0

    mutating func moveByX(deltaX: Double, y deltaY: Double) {
        self = TestPoint(x: x + deltaX, y: y + deltaY)
    }
}

var somePoint = TestPoint(x: 1.0, y: 1.0)
somePoint.moveByX(2.0, y: 3.0)

print("The point is now at (\(somePoint.x), \(somePoint.y))")

我遇到问题的部分是 func moveByX 语法。y deltaY 例如,这是如何允许的?y 是结构中声明的变量,但 deltaY 位在哪里出现?

somePoint.moveBy 中只传递了两个值

值是否同时传递给 y 和 deltaY ?

谢谢你的帮助

4

2 回答 2

2

内部和外部参数名称

让我们看一下 的函数签名moveByX(...)

mutating func moveByX(deltaX: Double, y deltaY: Double) 
    /*                  |            /  ^^^^^^- internal name      
                        |      external name
            internal name                                     */

在 Swift 2.2 中,默认情况下第一个函数参数为没有外部名称 ( _),这意味着函数moveByX(...)被调用为:

someTestPointInstance.moveByX(someXvalue, y: someYvalue)
    /*                        |           \
                no external name         external name        */
                      

这意味着y您在签名中看到的moveByX(...)只是一个外部参数名称,当我们进入函数体(使用内部参数名称)时,它不再有任何用处deltaY。因此,传递给moveByX(...)外部参数 name的第二个参数将在实际函数体中y引用(在本例中,复制到) 。deltaY

最后注意函数体中使用的xand属性y

self = TestPoint(x: x + deltaX, y: y + deltaY)

是成员属性x,并在结构y的定义中定义SomePoint

以上对 Swift 3.0 仍然有效吗?

如上所述:如果我们不为Swift 2.2中的函数参数提供显式的外部参数名称,则适用以下规则:

  • 默认情况下,第一个函数参数将没有外部参数名称(如上所示,_)。

  • 默认情况下,以下所有函数参数(第二个、第三个等)将具有与内部参数名称相同的外部参数名称。因此,如果我们将函数签名编写为moveByX(...)as

      mutating func moveByX(deltaX: Double, deltaY: Double) 
    

    那么第二个参数的外部参数名称将是deltaY,我们将函数称为

      someTestPointInstance.moveByX(someXvalue, deltaY: someYvalue)
    

Swift 3.0中,所有参数名称都遵循上面的第二条规则,即;如果没有提供外部参数名称,则内部参数名称将用作所有参数的外部参数名称。

这意味着上面的例子必须修改成类似的东西

struct TestPoint {
    var x = 0.0, y = 0.0

    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        self = TestPoint(x: x + deltaX, y: y + deltaY)
    }
}

// called as 
someTestPointInstance.moveBy(x: someXvalue, y: someYvalue)
于 2016-07-21T14:24:01.000 回答
0

Read the chapter "Function Parameter Names".

Basically, in moveByX, "y" is an external parameter name for "deltaY" and it's used to label "deltaY".

于 2016-07-21T14:32:01.390 回答