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==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内部;

你可能感兴趣的:(Swift的闭包捕获变量和OC的Block捕获变量)