捕获变量或常量

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

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()

最后更新于