Swift结构体static变量与didSet行为解析:最后输出为何是Turing
Swift结构体代码输出逻辑解析
核心概念要点
- 静态属性
XA.xa:属于结构体本身,所有实例共享同一个值,并非每个实例单独持有。 - 属性观察器
didSet:仅当属性的值被修改时触发,结构体初始化阶段给属性赋值不会触发didSet。
逐行代码执行分析
初始化
objXA:var objXA = XA(xb: "Turing")这是结构体初始化流程,给
xb赋值为"Turing",但不会触发didSet,因此静态属性XA.xa保持初始值"Advanced",对应第一个print输出Advanced。修改
objXA.xb:objXA.xb = "Swift"此处是修改已完成初始化的
xb属性,触发didSet观察器,将oldValue(修改前的"Turing")赋值给XA.xa,此时XA.xa变为"Turing",对应第二个print输出Turing。初始化
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
相关产品推荐
相关产品推荐

