2014-06-16 34 views
3

这给了我一个操场上的错误。在Swift中返回func的func

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

    return f 
} 

现在我读了一个名为“returnAFunc”的func,它返回另一个不返回值的func。正确?但它不起作用。我必须这样做:

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

    return f 
} 

好吧,看起来不正确。有人可以解释吗?

回答

4

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

我觉得你的基本误解是()代表一个函数类型。相反,它和Void一样。一旦你明白了这一点,唯一的另一个潜在的“陷阱”就是记住箭头是右联合的。

编辑:由于我得到了复选标记,我认为值得引起注意IMSoP's answer,它很好地解释了如何更详细地阅读该类型。

+0

是的,我相信由于你所指出的,我有一些困惑。我认为他们需要在未来的Swift迭代中做得更清楚。 – AlwaysLearning

1

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

当然,语法有点不可思议,但是一旦你习惯了它,看起来很简单。

此外,夫特型void表示为“()”,所以也可以将其解释为“功能returnAFunc需要一个空隙参数(这意味着没有参数),并返回一个空隙型(这意味着无参数)。 “不过,我不确定实际情况是幕后发生了什么。

3

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

() ->() 

那是不带参数,没有返回值的函数的签名(无效)

所以,

func myFunc() ->() 

声明函数不返回任何东西(无效),并且

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

声明函数retu rns一个函数,它不接受任何参数并且不返回任何内容。

6

让我们打破你的定义:

func returnAFunc() ->() 
  • func关键字
  • returnAFunc函数名
  • ()参数预期(空/无)
  • ->读作 “退货”
  • ()无效返回类型

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

工作版本打破了这样的:

func returnAFunc() ->() ->() 
  • func关键字
  • returnAFunc函数名
  • 预期(空/无)
  • ->读作 “退货”
  • ()参数
  • () ->() retu RN类型是另一个功能规格:
    • ()返回函数没有读成 “返回”
    • ()返回函数返回void

所以这个功能不带参数的参数

  • ->,并返回(不带参数并不返回任何内容的函数)。 (Eesh,即使用英文,我觉得有必要在那里加上额外的括号......)