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

Swift中对象属性赋值与加减乘操作的差异(private(set)场景)

关于Swift中private(set)属性的运算与直接赋值的本质区别

核心前提

private(set)修饰属性时,意味着该属性的读取权限(getter)对外部代码开放,但写入权限(setter)仅限制在类/结构体内部。外部只能读取属性值,无法直接修改——但这里的"修改"特指触发setter的赋值操作。

运算操作(如saul.age + 1)的本质

这类运算并没有修改原属性,过程是:

  • 先通过getter读取saul.age的当前值(示例中是19);
  • 基于读取到的值执行算术运算,生成一个临时的新值(比如19+1得到20);
  • 这个临时值没有被赋值回age属性,所以原属性的存储值完全不受影响。

简单说,你只是拿属性的值"做了个计算",没有碰属性本身的存储内容。

直接赋值(saul.age = 22)的本质

直接赋值操作会主动触发属性的setter方法,而private(set)已经把setter的访问权限锁在了类内部,外部代码没有权限调用这个setter,因此编译器直接抛出"setter不可访问"的错误。

只有类内部的代码(比如示例中的getOlder()方法)才能调用setter修改属性值,因为这些代码处于private(set)允许的访问范围内。

结合示例验证

看你的代码执行流程:

  1. 初始化后saul.age为18,外部读取打印正常;
  2. 调用saul.getOlder(),类内部通过age = age + 1调用setter,age被修改为19;
  3. 外部执行saul.age + 1等运算,仅读取19生成临时值,原age仍为19;
  4. 尝试直接赋值时,因外部无setter权限被拦截;
  5. 最终打印saul.age还是19,验证了运算不修改原属性的结论。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 04:57:22