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,由于它仍然保持自己的状态(例如,owntotalMeters
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
}()