在Swift中返回func的func

在Swift中返回func的func,swift,Swift,这让我在操场上犯了一个错误 func returnAFunc() -> () { func f(){ println("hello") } return f } 现在我把它理解为一个名为“returnAFunc”的func,它返回另一个不返回值的func。对的但它不起作用。我必须这样做: func returnAFunc() -> () -> () // or this (() -> ()) { func f(){ println("h

这让我在操场上犯了一个错误

func returnAFunc() -> ()
{
    func f(){ println("hello") }

    return f
}
现在我把它理解为一个名为“returnAFunc”的func,它返回另一个不返回值的func。对的但它不起作用。我必须这样做:

func returnAFunc() -> () -> ()     // or this (() -> ())
{
    func f(){ println("hello") }

    return f
}

好吧,那似乎不对。有人能解释一下吗?

第一个示例的内容是“Function
returnAFunc
不带参数,也不返回值”。第二个示例正确地将返回类型定义为“Function
returnAFunc
不带参数,并且返回一个不带参数,也不返回参数的函数。”

当然,语法有点不稳定,但是一旦你习惯了它,你就可以很容易地看到发生了什么

此外,Swift类型
void
表示为“
()
”,因此您也可以将其解释为“Function
returnAFunc
接受一个void参数(这意味着没有参数)并返回一个void类型(这意味着没有参数)。“不过,我不确定这实际上是在幕后发生的事情。

()
是一个空元组。Swift将其用作void函数的返回类型,因此

  () -> ()
函数的签名,该函数不接受任何参数,也不返回任何内容(为void)

所以

声明一个不返回任何内容的函数(为void),并且


声明一个返回函数的函数,该函数不带参数但不返回任何内容。

第一个
returnAFunc
的类型签名是
()->()
,这意味着一个不带参数但不返回任何内容的函数。第二个函数的类型是
()->()->()
,这意味着一个函数不带参数并返回类型为
()->()
的函数(即一个不带参数且不返回任何内容的函数)

我认为您的基本误解是
()
表示函数类型。相反,这和空虚是一样的。一旦你明白了这一点,唯一的另一个潜在的“陷阱”就是记住箭头是正确的


编辑:由于我得到了复选标记,我认为值得引起注意,这在解释如何更详细地阅读字体方面做得很好。

让我们来详细介绍一下您的定义:

func returnAFunc() -> ()
  • func
    关键字
  • returnAFunc
    函数名
  • ()
    预期参数(无效/无)
  • ->
    读作“返回”
  • ()
    无效返回类型
所以这个函数不接受任何参数,也不返回任何内容

工作版本如下所示:

func returnAFunc() -> () -> ()
  • func
    关键字
  • returnAFunc
    函数名
  • ()
    预期参数(无效/无)
  • ->
    读作“返回”
  • ()->()
    返回类型是另一个函数规范:
    • ()
      返回的函数不接受任何参数
    • ->
      读作“返回”
    • ()
      返回的函数返回void

所以这个函数不带参数,只返回(一个不带参数,不返回任何内容的函数)。(Eesh,即使是在英语中,我也觉得有必要加上额外的括号…

是的,我相信我有点困惑,因为你指出了这一点。我认为他们需要在Swift的未来迭代中更清楚地说明这一点。
func returnAFunc() -> ()
func returnAFunc() -> () -> ()