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

Swift结构体static变量与didSet行为解析:最后输出为何是Turing

Swift结构体代码输出逻辑解析

核心概念要点

  • 静态属性XA.xa:属于结构体本身,所有实例共享同一个值,并非每个实例单独持有。
  • 属性观察器didSet:仅当属性的值被修改时触发,结构体初始化阶段给属性赋值不会触发didSet。

逐行代码执行分析

  1. 初始化objXA:

    var objXA = XA(xb: "Turing")
    

    这是结构体初始化流程,给xb赋值为"Turing",但不会触发didSet,因此静态属性XA.xa保持初始值"Advanced",对应第一个print输出Advanced。

  2. 修改objXA.xb:

    objXA.xb = "Swift"
    

    此处是修改已完成初始化的xb属性,触发didSet观察器,将oldValue(修改前的"Turing")赋值给XA.xa,此时XA.xa变为"Turing",对应第二个print输出Turing。

  3. 初始化objXB:

    let objXB = XA(xb: "Quiz")
    

    同样是初始化流程,给xb赋值为"Quiz",不会触发didSet,所以静态属性XA.xa维持之前的"Turing"不变,对应最后一个print输出Turing。

关键疑问解答:最后一行为何不是Swift?

你疑惑的核心点在于误以为初始化objXB会修改XA.xa,但实际逻辑是:

  • didSet仅在属性被修改时执行,结构体初始化阶段给属性赋值不属于"修改"操作,因此不会触发didSet,自然不会改变XA.xa的当前值(即之前的"Turing")。
  • 若想在初始化时触发类似逻辑,需要在初始化器中手动处理,didSet本身的设计就是初始化阶段不触发。

内容的提问来源于stack exchange,提问作者sandeep tomar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:22:40