一个func在Swift中返回一个func

时间:2014-06-16 19:29:44

标签: swift

这在操场上给我一个错误。

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

    return f
}

现在我把它读作一个名为" returnAFunc"的函数。返回另一个不返回值的函数。正确?但它不起作用。我必须这样做:

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

    return f
}

好吧,这似乎并不合适。有人可以解释一下吗?

4 个答案:

答案 0 :(得分:6)

让我们分解你的定义:

func returnAFunc() -> ()
  • func关键字
  • returnAFunc功能名称
  • ()参数expected(void / none)
  • ->读作"返回"
  • () void return type

所以这个函数不带参数,什么也不返回。

工作版本如下所示:

func returnAFunc() -> () -> ()
  • func关键字
  • returnAFunc功能名称
  • ()参数expected(void / none)
  • ->读作"返回"
  • () -> ()返回类型是另一个函数规范:
    • ()返回的函数不带参数
    • ->读作"返回"
    • ()返回的函数返回void

所以这个函数不带参数,并返回(一个不带参数但什么都不返回的函数)。 (Eesh,即使是英文,我觉得有必要为此添加额外的括号......)

答案 1 :(得分:4)

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

我认为你的基本误解是()代表一种功能类型。相反,它与Void相同。一旦你理解了这一点,唯一的另一个潜力就是"陷阱"是要记住箭头是右关联的。

编辑:由于我收到了复选标记,我认为值得注意IMSoP's answer,这非常适合解释如何更详细地阅读该类型。

答案 2 :(得分:3)

()是一个空元组。 Swift使用它作为void函数的返回类型,所以

  () -> ()

函数的签名是否不带参数并且什么都不返回(无效)

所以,

func myFunc() -> ()

声明一个不返回任何内容的函数(无效)和

func myFunc() -> () -> ()

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

答案 3 :(得分:1)

您的第一个示例读作"函数returnAFunc不带参数,并且不返回任何值。"第二个示例正确地将返回类型定义为"函数returnAFunc不带参数,并返回不带参数且不返回参数的函数。"

可以肯定的是,语法有点不稳定,但是一旦你习惯了它,看看它发生了什么就非常简单。

此外,Swift类型void表示为" ()",因此您也可以将其解释为"函数returnAFunc需要void参数(表示没有参数)并返回void类型(表示没有参数)。"我不确定其实际上是在幕后发生的事情。