变异乐趣调用swift语法

时间:2016-07-21 14:08:05

标签: swift syntax mutating-function

我正在阅读Swift 2.2中的男人并尝试在变异乐趣部分中理解一个函数,这里是代码

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语法。例如,delta delta是如何允许的? y是结构中声明的变量,但deltaY位在哪里?

somePoint.moveBy

中只传递了两个值

值是否传递给y和deltaY?

感谢您的帮助

2 个答案:

答案 0 :(得分: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(...)只是一个外部参数名称,当我们'时,它们不再有用。 ve进入函数体(使用内部参数名称deltaY)。因此,传递给moveByX(...)的第二个参数,外部参数名称y将在实际函数体中被引用(在本例中,复制到)deltaY

最后请注意函数体中使用的xy属性

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

x结构定义中定义的成员属性ySomePoint

上述内容对Swift 3.0仍然有效吗?

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

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

    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)

答案 1 :(得分:0)

阅读“功能参数名称”一章。

基本上,在moveByX中,“y”是“deltaY”的外部参数名称,它用于标记“deltaY”。