为什么Swift全局函数作为闭包的特殊情况捕获全局变量?

mar*_*cel 2 closures ios swift

根据Apple Swift文档:全局函数是具有名称但不捕获任何值的闭包.但是我在使用Swift的IOS 11 Programming Fundamentals一书中讨论了使用闭包的示例,它将全局函数A作为参数传递给另一个全局函数B来修改全局变量x的值.该书指出A捕获X,这与Swift文档所说的相矛盾.

代码示例:

func pass100(_ f: (Int) -> ()) {
    f(100)
}

var x = 0
print(x) // output 0

func setX(newX: Int) {
     x = newX
}

pass100(setX)
print(x) //output 100
Run Code Online (Sandbox Code Playgroud)

上面的代码片段在Xcode中工作,我很困惑.谁能解释一下这里发生了什么?

Swe*_*per 5

就是"捕获"的意思:

闭包可以从定义它的周围上下文中捕获常量和变量.然后闭包可以引用并修改其体内的常量和变量的值,即使定义常量和变量的原始范围不再存在.

据说全局函数没有捕获任何东西,因为在程序运行时你永远不会离开全局范围,因此捕获任何东西都没有意义.如果它确实捕获了某些东西,那意味着即使在你以某种方式"离开"全局范围(也许程序完成运行)之后,全局变量仍然可以改变,这很奇怪.

代码中的全局函数不捕获任何内容.它可以x简单地改变它的值,因为x它仍然在范围内.你没有离开全球范围.