内部和外部参数名称
让我们看一下 的函数签名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
最后注意函数体中使用的x
and属性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)