返回一个函数vs返回一个闭包

时间:2015-02-03 10:37:38

标签: function swift closures

在Swift中,据我所知,闭包保留了他们的环境,而正常的功能却没有。

考虑下面的f(返回一个函数)和h(返回一个闭包)。 f()()h()()都返回3。为什么f()()不会导致运行时错误?

func f() -> () -> Int { 
    let a = 3
    func g() -> Int { 
        return a
    } 
    return g 
} 

func h() -> () -> Int {
    let a = 3
    return { () in a }
}

2 个答案:

答案 0 :(得分:6)

你所写的并不完全正确,因为根据documentation

  

全局函数是具有名称但不捕获任何值的闭包。

     

嵌套函数是具有名称的闭包,可以从其封闭函数中捕获值。

     

Closure表达式是一种未命名的闭包,用轻量级语法编写,可以从周围的上下文中捕获值。

所以g()确实捕获了值。

答案 1 :(得分:1)

g这样的内联函数确实保留了上下文。实际上,函数被命名为闭包,或者闭包是未命名的函数(无论您喜欢哪种定义)。

如文件中所述:

  

函数中引入的全局函数和嵌套函数实际上是闭包的特殊情况