gpt4 book ai didi

swift - 改变有趣的调用 swift 语法

转载 作者:搜寻专家 更新时间:2023-11-01 07:21:50 24 4
gpt4 key购买 nike

我正在通读 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?

谢谢你的帮助

最佳答案

内部和外部参数名称

让我们看一下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 在实际的函数体中。

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

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

SomePoint 结构定义中定义的成员属性 xy

以上内容对 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)

关于swift - 改变有趣的调用 swift 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38506518/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com