改变有趣的调用 swift 语法
Mutating fun call swift syntax
我正在通读 Swift 2.2 手册,并试图理解 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?
感谢您的帮助
内部和外部参数名称
我们来看看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 */
这意味着你在moveByX(...)
的签名中看到的y
只是一个外部参数名,不再有任何用处当我们进入函数体时(其中使用了 内部参数名称 、deltaY
)。因此传递给 moveByX(...)
的第二个参数,外部参数名称 y
,将在实际函数体中被引用(在本例中,复制到)deltaY
。
最后注意函数体中使用的x
和y
属性
self = TestPoint(x: x + deltaX, y: y + deltaY)
是 x
和 y
的成员属性,定义在 SomePoint
结构中。
以上内容对 Swift 3.0 是否仍然有效?
如上文所述:如果我们不为 Swift 2.2 中的函数参数提供明确的外部参数名称,则适用以下规则:
默认情况下,第一个函数参数没有外部参数名称(如上所示,_
)。
默认情况下,以下所有函数参数(第二个、第三个等)的外部参数名称与内部参数名称相同。因此,如果我们将 moveByX(...)
的函数签名写为
mutating func moveByX(deltaX: Double, deltaY: Double)
那么第二个参数的外部参数名称将是deltaY
,我们将函数调用为
someTestPointInstance.moveByX(someXvalue, deltaY: someYvalue)
在Swift3.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)
阅读章节 "Function Parameter Names"。
基本上,在moveByX中,"y"是"deltaY"的外部参数名称,用于标记"deltaY"。
我正在通读 Swift 2.2 手册,并试图理解 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?
感谢您的帮助
内部和外部参数名称
我们来看看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 */
这意味着你在moveByX(...)
的签名中看到的y
只是一个外部参数名,不再有任何用处当我们进入函数体时(其中使用了 内部参数名称 、deltaY
)。因此传递给 moveByX(...)
的第二个参数,外部参数名称 y
,将在实际函数体中被引用(在本例中,复制到)deltaY
。
最后注意函数体中使用的x
和y
属性
self = TestPoint(x: x + deltaX, y: y + deltaY)
是 x
和 y
的成员属性,定义在 SomePoint
结构中。
以上内容对 Swift 3.0 是否仍然有效?
如上文所述:如果我们不为 Swift 2.2 中的函数参数提供明确的外部参数名称,则适用以下规则:
默认情况下,第一个函数参数没有外部参数名称(如上所示,
_
)。默认情况下,以下所有函数参数(第二个、第三个等)的外部参数名称与内部参数名称相同。因此,如果我们将
moveByX(...)
的函数签名写为mutating func moveByX(deltaX: Double, deltaY: Double)
那么第二个参数的外部参数名称将是
deltaY
,我们将函数调用为someTestPointInstance.moveByX(someXvalue, deltaY: someYvalue)
在Swift3.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)
阅读章节 "Function Parameter Names"。
基本上,在moveByX中,"y"是"deltaY"的外部参数名称,用于标记"deltaY"。