You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:35:28