Swift的闭包捕获变量和OC的Block捕获变量
2020-08-05 本文已影响0人
糖糖uzi
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==10
从这个打印可以看出 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内部;