返回函数与返回闭包的区别

3
在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个回答

6
你所写的并不完全正确,因为根据文档所述:
全局函数是具有名称且不捕获任何值的闭包。
嵌套函数是具有名称且可以捕获其封闭函数中的值的闭包。
闭包表达式是以轻量级语法编写的未命名闭包,可以从其周围的上下文中捕获值。
因此g()确实会捕获值。

感谢Dániel和@Antonio。我想知道为了一致性,设计师是否可以避免引入第二个语法(in)。 - Danyal Aytekin
2
如果这是你的意思,实际上你可以只返回 { a }。 - Dániel Nagy
不完全正确,但这也很有用! - Danyal Aytekin

1

g这样的内联函数确实会保留上下文。实际上,函数是命名闭包,或者闭包是未命名函数(您喜欢哪个定义就用哪个)。

如文档所述:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接