我尝试了两种初始化lazy var的方法,一种可以工作,另一种得到编译器错误。
- String = String();maxDiscount.最大折扣百分比
1.错误:MaxDiscount()。maxDiscountPercent如果maxDiscountPercent是一个存储属性而不是一个惰性变量,两种用法都可以使用。
简化示例:
struct MaxDiscount {
lazy var maxDiscountPercent: Int = {
print("Lazy var maxDiscountPercent initialized")
return 256
}()
}
// initializes lazy var without an error
var maxDiscount = MaxDiscount()
print("Max percent discount: ", maxDiscount.maxDiscountPercent)
// initializes lazy var with error:
// "Cannot use mutating getter on immutable value: function call returns immutable value"
var maxDiscountPercent = MaxDiscount().maxDiscountPercent
print("Max percent discount: ", maxDiscountPercent)
我不清楚为什么一种用法是可变的而另一种是不变的。
1条答案
按热度按时间jogvjijk1#
当你写
var maxDiscount
时,你声明了一个变量(可变的)。你会有一个常量(不可变的)let maxDiscount = MaxDiscount()
。现在有了
var maxDiscountPercent = MaxDiscount().maxDiscountPercent
,MaxDiscount()
是一个匿名常量,你不能对它做任何事情。尝试
let maxDiscount = MaxDiscount()
,您将得到相同类型的错误,并邀请将let
更改为var
。