Swift类属性初始化问题:为何两段等边三角形类代码一段生效一段失效
两段Swift代码运行差异原因
核心区别:存储属性与计算属性的规则不同
- 第一段代码中的
perimeter是计算属性:它不会预先存储具体数值,只有当它被外部访问时,才会执行大括号内的逻辑实时计算返回值。此时类的实例已经完成初始化,self可正常访问,所以可以正常读取sideLength的值进行计算,且perimeter的值会随sideLength的修改实时更新。 - 第二段代码中的
perimeter是存储属性:Swift语法规定,存储属性的默认值必须在类实例初始化完成前就确定,此时实例还未构造完成,self处于不可用状态,无法访问另一个实例属性sideLength,因此编译器会直接报错,代码无法运行。
补充:如果要让存储属性的写法也能正常运行,可以将
perimeter改为懒加载存储属性:lazy var perimeter: Double = 3.0 * sideLength懒加载属性只会在第一次被访问时才会赋值,此时实例已经完成初始化,可正常读取
sideLength的值。但它和计算属性的区别是:懒加载属性只会计算一次,后续sideLength修改时,perimeter的值不会自动更新。
内容的提问来源于stack exchange,提问作者Tbag
相关产品推荐
相关产品推荐

