捕获变量或常量

闭包可以在其被定义的上下文中捕获常量或变量。即使定义这些常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值

1. 捕获的方式是引用捕获

闭包是以引用的方式捕获常量和变量。捕获的变量可以在闭包中修改,并且会影响原本的变量。
var a = 1
// 引用捕获a
let function = {() in
a += 1
}
function()
function()
print(a) // a = 3
为了优化,如果一个值不会被闭包改变,或者在闭包创建后不会改变,Swift 可能会改为捕获并保存一份对值的拷贝。

2. 闭包会管理捕获变量或常量的生命周期

Swift 负责被捕获变量的所有内存管理工作.即使捕获的常量和变量的原作用域已经不存在,闭包仍然可以在闭包函数体内引用和修改这些值。
var function : (() -> Void )!
if true{
var a = 1
function = {() in
a += 1
}
}
// a 看似生命周期结束,但闭包管理了a的生命周期,仍然可以访问
function()
function()