在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 }
}
答案 0 :(得分:6)
你所写的并不完全正确,因为根据documentation:
全局函数是具有名称但不捕获任何值的闭包。
嵌套函数是具有名称的闭包,可以从其封闭函数中捕获值。
Closure表达式是一种未命名的闭包,用轻量级语法编写,可以从周围的上下文中捕获值。
所以g()确实捕获了值。
答案 1 :(得分:1)
像g
这样的内联函数确实保留了上下文。实际上,函数被命名为闭包,或者闭包是未命名的函数(无论您喜欢哪种定义)。
如文件中所述:
函数中引入的全局函数和嵌套函数实际上是闭包的特殊情况