Swift 关于函数和闭包的一个小问题

Swift 关于函数和闭包的一个小问题,swift,function,closures,Swift,Function,Closures,第一个planA()print2000,第二个planA()print4000。 每次我调用planA() 为什么? var totalMeters=0在此函数中有何用途? planA()是否与runningmeters with MetersPerDay(MetersPerDay:2000)相同? 如果没有,它们之间有什么区别? 谢谢你的帮助。好吧,你的方法会返回一个闭包,你会执行两次。 闭包捕获它的环境,在您的例子中是“外部”变量totalMeters,并通过不同的调用保持它的值 如果这不是

第一个
planA()
print2000,第二个
planA()
print4000。 每次我调用
planA()
为什么?
var totalMeters=0
在此函数中有何用途?
planA()
是否与
runningmeters with MetersPerDay(MetersPerDay:2000)相同?
如果没有,它们之间有什么区别?

谢谢你的帮助。

好吧,你的方法会返回一个闭包,你会执行两次。 闭包捕获它的环境,在您的例子中是“外部”变量
totalMeters
,并通过不同的调用保持它的值

如果这不是您想要的,您必须将
totalMeters
放入闭包中,如下所示:

func runningMetersWithMetersPerDay ( metersPerDay: Int ) -> () -> 
Int {
    var totalMeters = 0
    return {
        totalMeters += metersPerDay
        return totalMeters
    }
}
var planA = runningMetersWithMetersPerDay (metersPerDay: 2000)
planA()
planA()

要回答以下评论中的问题: 我修改了原始函数和调用,以打印出一些提示:

planA
是函数
runningMetersWithMetersPerDay
(类型为
(())->Int
的闭包-获取
void
参数并返回Int)的结果,然后执行闭包两次并获得结果(2000、4000)

现在,再次调用函数
runningMetersWithMetersPerDay(metersPerDay:)
,返回一个新的闭包,然后超出该返回值。它返回2000,因为它是一个新的闭包(尽管没有分配给变量)。 可以这样想:

func runningMetersWithMetersPerDay ( metersPerDay: Int ) -> () ->
    Int {
        print ("rMWMD called")
        var totalMeters = 0
        return {
            totalMeters += metersPerDay
            print ("calculated new result: \(totalMeters)")
            return totalMeters
        }
}

print ("start")
var planA = runningMetersWithMetersPerDay (metersPerDay: 2000) // "rMWMPD called"
print ("got planA")
planA() // "calculated new result:2000"
planA() // "calculated new result:4000"

runningMetersWithMetersPerDay (metersPerDay: 2000)() // "calculated new result: 2000"
planA() // "calculated new result:6000"
print ("end")

最后,第三次执行planA,由于它仍然保持自己的状态(例如,own
totalMeters
value),因此返回6000

这里发生的事情是正常的。 让我们一步一步走

首先,您运行:

    runningMetersWithMetersPerDay (metersPerDay: 2000) /* "rMWMPD called" and now call the closure: */ () // "calculated new result: 2000"
你在这里执行什么

var planA = runningMetersWithMetersPerDay (metersPerDay: 2000)
你在planA有什么

  • 具有可变totalMeters的上下文
  • 准备在此上下文中执行的函数
  • 第一次运行,totalMeters=0

    var totalMeters = 0
    return {
        totalMeters += metersPerDay
        return totalMeters
    }
    
    第二次运行,totalMeters=2000

    {
        totalMeters += metersPerDay
        return totalMeters
    }()
    

    新结果=4000

    嗨,谢谢你的回答。但我发现了另一个小问题。首先我调用了planA()两次,结果打印2000和4000,然后我尝试调用runningMetersWithMetersPerDay(metersPerDay:2000)(),结果打印2000,然后我再次调用planA(),结果打印6000。既然planA=runningMetersWithMetersPerDay(metersPerDay:2000),为什么我在调用planA()和runningMetersWithMetersPerDay(metersPerDay:2000)时会有这么大的不同呢?@Wilson:请看我修改过的答案,希望现在能弄清楚。我的回答和Andreas一样:)哈哈!不客气,威尔逊。
    {
        totalMeters += metersPerDay
        return totalMeters
    }()
    
    {
        totalMeters += metersPerDay
        return totalMeters
    }()