Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 对Swift嵌套函数如何工作感到困惑_Function_Oop_Swift - Fatal编程技术网

Function 对Swift嵌套函数如何工作感到困惑

Function 对Swift嵌套函数如何工作感到困惑,function,oop,swift,Function,Oop,Swift,例如,以以下代码为例: func jediTrainer () -> ((String, Int) -> String) { func train(name: String, times: Int) -> (String) { return "\(name) has been trained in the Force \(times) times" } return train } let train = jediTrainer() train("Obi W

例如,以以下代码为例:

func jediTrainer () -> ((String, Int) -> String) {
  func train(name: String, times: Int) -> (String) {
    return "\(name) has been trained in the Force \(times) times"
  }
  return train
}
let train = jediTrainer()
train("Obi Wan", 3)

我完全搞不清楚这个函数中发生了什么。jediTrainer不接受任何参数,并返回一个名为train的函数。当我们说train=train时,我们现在是否将函数train存储到名为train的变量中,因为它返回了现在存储在变量中的函数?你能把这里发生的事情分解成几个步骤吗?非常感谢你

在Swift函数中,函数是第一类对象,这意味着函数可以被变量引用、作为参数传递以及从其他函数返回

在您的例子中,jediTrainer返回一个本身是嵌套函数的函数。所以,让训练是指训练器中的训练功能。现在可以使用train变量调用train函数


有关这方面的更多信息,请参阅函数类型和相关主题。

您还可以在其他函数体中定义函数。这些函数称为嵌套函数。 默认情况下,嵌套函数对外隐藏。它仍然可以被其封闭函数调用和使用。封闭函数也可以返回其中一个嵌套函数,从而允许嵌套函数在另一个作用域中使用

func  aFunc (flag:Book)->(Int)->Int
{

func plus ( input:Int )->Int 
{
return input + 1
}

func minus ( input:Int )->Int 
{
return input - 1
}

if (flag)
{
return plus
}

else
{
return minus 
}
}

让您感到困惑的是,您给了新函数相同的名称。jediTrainer不接受任何参数,但它返回一个接受两个参数的函数。您已经创建了一个名为train的新函数,它的行为与它应该的完全一样。谢谢您的回复。那么,变量序列存储的是函数序列,你可以调用它。变量可以是任何东西,包括一个函数