在有关嵌套函数的快速语言指南中: 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!")
我的问题是:
第一个箭头是什么意思?我知道如何返回一个值,即-> int,但是在这种情况下,有两个返回值(或箭头?)? func ChooseStepFunction(backward:Bool)->(Int)-> Int
在return语句中,向后返回? stepBackward:stepForward 为什么在调用这些函数时stepBackward / stepForward不需要括号?
currentValue = moveNearerToZero(currentValue),为什么我们要使用变量moveNearerToZero调用函数?另外,为什么需要在moveNearerToZero之后加上括号?
谢谢
答案 0 :(得分:1)
让我们从第一点开始
func chooseStepFunction(backward: Bool) -> (Int) -> Int
通过查看此函数声明,您可以说chooseStepFunction
是接受一个类型为Bool
的参数的函数,并且它返回一个类型为(Int)-> Int
的函数,该函数将一个Int参数作为参数并返回Int
。因此,chooseStepFunction
在此基于传入的(Int)->Int
参数返回类型为backward
的函数。
stepBackward
或stepForward
,这就是为什么我们不使用括号()的原因。从第一点开始,您应该了解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))")
希望有帮助。