Swift中的嵌套函数意外行为?
Posted
技术标签:
【中文标题】Swift中的嵌套函数意外行为?【英文标题】:Nested function unexpected behaviour in Swift? 【发布时间】:2020-07-25 06:18:48 【问题描述】:我正在为嵌套函数尝试以下示例,但出现意外行为:
func chooseStepFunction(value: Int, backward: Bool) -> (Int) -> Int
print("Current value: \(value)")
func stepForward(input: Int) -> Int
print("plus from \(input)");
return input + 1
func stepBackward(input: Int) -> Int
print("minus from \(input)");
return input - 1
return backward ? stepBackward : stepForward
var currentValue = 4
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != -2
print("\(currentValue)... ")
currentValue = moveNearerToZero(currentValue)
我尝试使用向后和向前嵌套函数,但得到以下结果:
Current value: 4
4...
minus from 4
3...
minus from 3
2...
minus from 2
1...
minus from 1
0...
minus from 0
-1...
minus from -1
就像,每次我修改currentValue
和每次我调用chooseStepFunction
但在控制台中chooseStepFunction
函数内的currentValue
只执行一次,但while 循环内的currentValue
正在执行evrytime 那么为什么chooseStepFunction
正在跳过打印值。在我看来,预期的结果将是:
Current value: 4
4...
minus from 4
3...
minus from 3
2...
minus from 2
1...
minus from 1
0...
plus from 0
1...
minus from 1
0...
plus from 0
1...
minus from 1
0...
..........
这将是一个无限循环,但为什么它工作正常? 完全没看懂?
【问题讨论】:
【参考方案1】:这一行:
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
只运行一次,因为它在循环之外。所以分支backward ? stepBackward : stepForward
只运行一次。代码选择了stepBackward
一次,以后再也没有。
let someName = someExpression
并不意味着“从现在开始,每次我说someName
,评估someExpression
”。它的意思是“评估someExpression
,并将结果放入名为someName
的常量中”。
要实现您想要的,您可以将chooseStepFunction
调用移动到循环中:
while currentValue != -2
print("\(currentValue)... ")
let moveNearerToZero = chooseStepFunction(value: currentValue, backward: currentValue > 0)
currentValue = moveNearerToZero(currentValue)
【讨论】:
以上是关于Swift中的嵌套函数意外行为?的主要内容,如果未能解决你的问题,请参考以下文章