知识卡片
惰性属性与计算属性的取舍
内容
lazy存储属性只在第一次被访问时执行一次初始化闭包并把结果缓存下来,之后无论依赖的数据怎么变都不会重新计算——这既是省去无谓开销的手段(如非常耗时的初始化推迟到真正用到时),也带来一个副作用:属性值可能与它本该依赖的其他属性悄悄脱节。计算属性则相反,每次访问都通过get(可选配set)重新执行计算,永远反映当前状态,但也永远要付出重新计算的代价。选择的标准很直接:如果计算成本高、且值本不该随时间变化,用lazy;如果值必须随其依赖的状态同步变化,只能用计算属性。lazy还有个语言层面的额外用途——闭包里访问self要求编译器确认self已完全初始化,标记lazy等于告诉编译器”这个属性不参与初始化过程,可以晚点再算”。
参考来源
《Swift编程权威指南》第16章《属性》