gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:25:39 27 4
gpt4 key购买 nike

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

第一个 planA() 打印 2000,第二个 planA() 打印 4000。每次我调用 planA() 时,数字都会累积为什么?var totalMeters = 0 在此函数中的用途是什么?planA() 是否与 runningMetersWith MetersPerDay (metersPerDay: 2000) 相同?如果不是,它们之间有什么区别?感谢您的帮助。

最佳答案

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

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

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

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

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 是函数 runningMetersWithMetersPerDay 的结果(类型为 (())->Int 的闭包 - take void 参数并返回 Int) ,然后执行两次 closure 并得到结果 (2000, 4000)。

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

    runningMetersWithMetersPerDay (metersPerDay: 2000) /* "rMWMPD called" and now call the closure: */ () // "calculated new result: 2000"

最后你第三次执行 planA,因为它仍然保持它自己的状态(例如自己的 totalMeters 值),它返回 6000。

关于swift - 关于函数和闭包的一个小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41972363/

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