这在操场上给我一个错误。
func returnAFunc() -> ()
{
func f(){ println("hello") }
return f
}
现在我把它读作一个名为" returnAFunc"的函数。返回另一个不返回值的函数。正确?但它不起作用。我必须这样做:
func returnAFunc() -> () -> () // or this (() -> ())
{
func f(){ println("hello") }
return f
}
好吧,这似乎并不合适。有人可以解释一下吗?
答案 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相同。一旦你理解了这一点,唯一的另一个潜力就是"陷阱"是要记住箭头是右关联的。
答案 2 :(得分:3)
()
是一个空元组。 Swift使用它作为void函数的返回类型,所以
() -> ()
函数的签名是否不带参数并且什么都不返回(无效)
所以,
func myFunc() -> ()
声明一个不返回任何内容的函数(无效)和
func myFunc() -> () -> ()
声明一个返回函数的函数,该函数不带任何参数并且不返回任何内容。
答案 3 :(得分:1)
您的第一个示例读作"函数returnAFunc
不带参数,并且不返回任何值。"第二个示例正确地将返回类型定义为"函数returnAFunc
不带参数,并返回不带参数且不返回参数的函数。"
可以肯定的是,语法有点不稳定,但是一旦你习惯了它,看看它发生了什么就非常简单。
此外,Swift类型void
表示为" ()
",因此您也可以将其解释为"函数returnAFunc
需要void参数(表示没有参数)并返回void类型(表示没有参数)。"我不确定其实际上是在幕后发生的事情。