Swift的闭包捕获变量和OC的Block捕获变量

closure捕获局部变量

    var a = 10
    
    let closure = {
        print("closure=", a)
    }
    
    a = 20
    print("out=", a)
    closure()
    print("out=", a)

打印

out= 20
closure= 20
out= 20

说明swift指的捕获是在执行的时候再捕获,当代码执行到 closure(),对变量a进行捕获,捕获到的变量是修改之后的值,所以两次打印一样

OC的block捕获局部变量

int a = 10;
void (^block)(void) = ^{
    NSLog(@"a==%d",a);
};
a = 20;
block();
NSLog(@"a==%d",a);

打印

a==10
a==20

从这个打印可以看出 block捕获发生在第三行,代码执行到第三行block内部对变量a进行了拷贝,所以不受后面赋值的影响

用swift实现跟OC相同的值捕获

使用[]符号 , 这种实现在Swift里叫捕获列表,capturing list
看如下代码

var a = 10

let closure = { [a] in
    print("closure=", a)
}

a = 20
print("out=", a)
closure()
print("out=", a)

这时候的打印

out= 20
closure= 10
out= 20

打印结果跟block捕获相同,说明捕获发生在定义closure内部;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容