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)允许的访问范围内。
结合示例验证
看你的代码执行流程:
- 初始化后
saul.age为18,外部读取打印正常; - 调用
saul.getOlder(),类内部通过age = age + 1调用setter,age被修改为19; - 外部执行
saul.age + 1等运算,仅读取19生成临时值,原age仍为19; - 尝试直接赋值时,因外部无setter权限被拦截;
- 最终打印
saul.age还是19,验证了运算不修改原属性的结论。
内容的提问来源于stack exchange,提问作者Avicii4ever
相关产品推荐
相关产品推荐

