Swift 中的嵌套函数意外行为?

Nested function unexpected behaviour in Swift?

我正在为嵌套函数尝试以下示例,但出现意外行为:

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...
..........

这将是一个无限循环,但为什么它运行良好? 完全没看懂?

这一行:

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)
}