Swfit嵌套函数

时间:2019-01-16 08:43:20

标签: swift function nested

在有关嵌套函数的快速语言指南中: https://docs.swift.org/swift-book/LanguageGuide/Functions.html#ID166

部分中的代码:

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
    var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")

我的问题是:

  1. 第一个箭头是什么意思?我知道如何返回一个值,即-> int,但是在这种情况下,有两个返回值(或箭头?)? func ChooseStepFunction(backward:Bool)->(Int)-> Int

  2. 在return语句中,向后返回? stepBackward:stepForward 为什么在调用这些函数时stepBackward / stepForward不需要括号?

  3. currentValue = moveNearerToZero(currentValue),为什么我们要使用变量moveNearerToZero调用函数?另外,为什么需要在moveNearerToZero之后加上括号?

谢谢

1 个答案:

答案 0 :(得分:1)

  1. 让我们从第一点开始

    func chooseStepFunction(backward: Bool) -> (Int) -> Int

通过查看此函数声明,您可以说chooseStepFunction是接受一个类型为Bool的参数的函数,并且它返回一个类型为(Int)-> Int的函数,该函数将一个Int参数作为参数并返回Int。因此,chooseStepFunction在此基于传入的(Int)->Int参数返回类型为backward的函数。

  1. 在以下return语句中,我们没有调用stepBackwardstepForward,这就是为什么我们不使用括号()的原因。从第一点开始,您应该了解chooseStepFunction将返回一个函数并且该函数的类型为(Int)->Int,并且仔细查看,您会发现stepBackward and stepForward签名为(Int)->Int,它将返回由chooseStepFunction

return backward ? stepBackward : stepForward

3。

let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)在这里chooseStepFunction返回了类型为(Int)->Int的函数,该函数存储在moveNearerToZero中,因此它不是一个简单的变量,这是一个为什么我们可以使用括号。

以下描述摘自swift文档,其中介绍了如何将函数用作类型:

使用功能类型 您可以像在Swift中使用其他类型一样使用函数类型。例如,您可以将常量或变量定义为函数类型,然后将适当的函数分配给该变量:

var mathFunction: (Int, Int) -> Int = addTwoInts 可以理解为:

“定义一个名为mathFunction的变量,该变量的类型为'一个具有两个Int值并返回一个Int值的函数。'将此新变量设置为引用名为addTwoInts的函数。”

addTwoInts(_:_:)函数的类型与mathFunction变量的类型相同,因此Swift的类型检查器允许进行此分配。

您现在可以使用名称mathFunction调用分配的函数:

print("Result: \(mathFunction(2, 3))")

希望有帮助。