Lazy var初始化报错:Cannot use mutating getter on immutable value 原因咨询
为什么Swift中Lazy Var两种初始化方式的可变性差异?
核心原因:Lazy属性的Getter是mutating方法,值类型临时实例默认不可变
直接拆解两种场景的本质:
可行场景的逻辑
你把MaxDiscount()实例赋值给了var变量maxDiscount,这个变量是可变的(值类型的var实例允许修改自身状态)。而lazy属性的getter本质是mutating方法——第一次访问时需要修改实例内部状态(完成lazy属性的初始化存储),可变实例可以正常调用这个mutating方法,因此不会报错。报错场景的逻辑
MaxDiscount()直接创建的是临时不可变实例(相当于隐式的let实例),因为它没有绑定到一个var变量上。Swift中,值类型的不可变实例(let)不允许调用任何mutating方法,而lazy属性的getter正好是mutating的,所以触发编译错误:Cannot use mutating getter on immutable value: function call returns immutable value。
为什么普通存储属性两种方式都可行?
普通存储属性的getter是非mutating的——访问它不需要修改实例本身,只是读取已存在的存储值,所以不管是可变实例还是临时不可变实例,都能正常访问。
验证:显式声明临时实例为可变即可解决报错
如果一定要用临时实例访问lazy属性,可以显式把它声明为可变:
var maxDiscountPercent = (var temp = MaxDiscount(); temp.maxDiscountPercent) print("Max percent discount: ", maxDiscountPercent)
这样就能正常编译,因为temp是var可变实例,允许调用mutating的lazy getter。
内容的提问来源于stack exchange,提问作者sgrem
相关产品推荐
相关产品推荐

