Swift闭包疑问:为何输出‘Hi, Jake’而非‘Hi, John’
为什么闭包输出'Hi, Jake'而非'Hi, John'?
先看你提供的代码:
var name = "Jake" let closure = { [name] in print ("Hi, \(name)!") } name = "John" closure()
核心原因是闭包定义时用了显式的捕获列表[name]:
- 当你在闭包开头写
[name] in时,Swift会在创建这个闭包的瞬间,把当时name的具体值(也就是"Jake")拷贝一份,存在闭包自己的存储空间里。 - 这种方式叫值捕获,和默认的引用捕获完全不同。默认情况下(不写捕获列表),闭包会捕获变量的引用,外部修改变量的值,闭包里拿到的内容也会跟着变。但这里你指定了值捕获,之后外部把
name改成"John",闭包里存的还是当初拷贝的"Jake",所以调用闭包时自然输出旧值。 - 如果想让闭包跟随外部
name的变化,删掉捕获列表里的[name]即可,让闭包默认捕获变量的引用:var name = "Jake" let closure = { print ("Hi, \(name)!") } name = "John" closure() // 此时会输出'Hi, John!'
内容的提问来源于stack exchange,提问作者Jackson Renson
相关产品推荐
相关产品推荐

