Swift 闭包如何存储对常量或值的引用
描述来源于 闭包可以捕获并存储对定义它们的上下文中任何常量和变量的引用。这被称为关闭这些常量和变量 我不完全理解存储引用部分。这是否意味着它会创建某种指向变量的“指针”?如果值更改,“取消引用的指针”也更改为新值。我认为斯威夫特没有指针的概念。我借它来表达我的理解 如果有人能提供一个简单的代码行来解释闭包如何存储对常量/变量的引用,那就太好了 这是否意味着它会创建某种指向变量的“指针”?如果 值更改“取消引用的指针”也更改为新指针 价值观 对 我认为斯威夫特没有指针的概念 它以引用类型(类)的(隐式)形式和 下面是一个在闭包中捕获变量的示例。这一切都是单线程的,但是您可以通过GrandCentralDispatch来调度这个闭包<捕获code>x,使其在闭包的整个生命周期内都存在,即使在Swift 闭包如何存储对常量或值的引用,swift,closures,Swift,Closures,描述来源于 闭包可以捕获并存储对定义它们的上下文中任何常量和变量的引用。这被称为关闭这些常量和变量 我不完全理解存储引用部分。这是否意味着它会创建某种指向变量的“指针”?如果值更改,“取消引用的指针”也更改为新值。我认为斯威夫特没有指针的概念。我借它来表达我的理解 如果有人能提供一个简单的代码行来解释闭包如何存储对常量/变量的引用,那就太好了 这是否意味着它会创建某种指向变量的“指针”?如果 值更改“取消引用的指针”也更改为新指针 价值观 对 我认为斯威夫特没有指针的概念 它以引用类型(类)的(
x
的声明范围(f()
)退出后闭包仍然存在
我写了这篇文章来解释函数、闭包和其他术语之间的关系。我认为这是值得一读的。如果你继续阅读Swift语言指南中的这一部分,你会看到他们展示并解释了一个
makeIncrementer
函数的示例,该函数演示了闭包如何将值捕获为引用。runningTotal
变量被捕获为引用,允许多次调用返回函数(捕获runningTotal
)来增加它,因为它引用了该变量–即使它是一种值类型。请注意,即使Swift作为一种语言在其中没有指针(比如JavaScript有闭包,但没有原始内存指针),这对Swift编译器输出的程序集没有影响。在程序集代码中会有许多间接引用(“指针”)。在Swift中许多非法的东西在swiftc输出中是完全合法的(例如,无界GOTO在编译器输出中很常见,但在语言中不存在)。非常感谢示例代码和进一步研究的资源)
func f() {
var x = 0 //captured variable
_ = {
x = 5 //captures x from parent scope, and modifies it
}()
print(x) //prints 5, as x was modified by the closure
}
f()