这是我参与11月更文应战的第12天,活动详情检查:2021最后一次更文应战


导言

相信咱们在日常开发时,必定用过关键字 Lazy。那运用它有什么好处呢?什么时分才需要运用呢,让咱们一同来看看吧~

运用 Lazy 可以做很多事情:

  • 实例化目标时不必给它的部分或悉数成员初始值
  • 调用之前,永远不会执行
  • 存储核算值并防止重复核算

声明 Lazy

只要在成员变量前面添加一个 Lazy 关键字,就可以将其声明为 lazy。慵懒成员有必要声明为 var。苹果的说法:

You must always declare a lazy property as a variable (with thevarkeyword), because its initial value might not be retrieved until after instance initialization completes.

有必要始终将慵懒特点声明为可变的(运用 var 关键字) ,因为在实例初始化完成之前,或许无法检索其初始值

因为一切常量在初始化结束时都有必要有一个值,因而有必要将慵懒特点声明为 var,举个,代码中的 fullname 是一个常量,初始化时没有赋值,就报错了。另一个heavyComputation被声明为 lazy,初始化时没有赋值,就不会报错。这个咱们应该都了解。

Swift 中的关键字——Lazy

经过把特点声明为 lazy,就减轻了初始化的作业。这就是懒加载了。

懒加载

另一个运用 lazy 的好处:加快初始化速度。作为开发者,咱们都期望赶快能实例化咱们的目标。因而,任何深重的使命或核算,尽量防止在初始化时来做,也有必要要防止。直到真正需要他们的时分,才去调用。让咱们来看个例子。

Swift 中的关键字——Lazy

从上面的例子可以显着看出,一切的核算都是在初始化 User 实例时完成的。这是因为 heavycalculation 被声明为 let 常量,需要在初始化结束时具有具体的值。因而,它是在同一时间核算。这并不是咱们想要的。

咱们把 heavycalculation 声明为 lazy,初始化时就不会核算它的值,直到第一次调用:

Swift 中的关键字——Lazy


防止重复核算

咱们也可以经过核算特点达到懒加载的效果:留意下面的代码和上面的代码的区别:

Swift 中的关键字——Lazy

从这个示例中可以显着看出,核算特点在初始化时也没有被核算。

但这是否意味着核算特点和 lazy 特点类似呢?虽然看起来很类似,但是他们有一个非常根本的区别,这就使得 lazy 愈加有用。

让咱们试试屡次拜访核算特点,看看会产生什么。

Swift 中的关键字——Lazy

从代码中发现,当咱们屡次拜访核算特点ー heavycalculation 时,每次拜访都会核算一遍(这里是两次)。

再来看看把 heavycalculation 声明为 lazy 时,再屡次调用,看看会产生什么:

Swift 中的关键字——Lazy

这次只核算该特点一次。这意味着,在第一次核算值之后,它的值就会被保存下来以备下次运用,并且与运用核算特点的情况不同,声明为 lazy 后,不会重复核算值。

因而,依据上面的示例,咱们可以很容易地确定 lazy 特点存储值,并且不会在每次拜访它们时进行核算。因而,节省了大量的处理器资源和时间。


运用留意事项

在了解了懒惰的作业原理之后,现在咱们有必要了解它的用法,并且在运用时要小心翼翼。

留意因为 lazy 特点只核算一次,因而内部逻辑不能依赖于其他变量,尤其是那些频繁改变的变量。这是因为,在第一次核算后,当其他的变量的值改变后,lazy 特点的值不能同步更新,运用时就会出错。

此外,lazy 不是线程安全的。这意味着当咱们在不同的线程上拜访同一个变量时,或许会得到不同的值。苹果的说法:

If a property marked with thelazymodifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there’s no guarantee that the property will be initialized only once.

假如标记为 lazy 修饰符的特点被多个线程一起拜访,而该特点尚未初始化,则不能确保该特点只初始化一次。

这表明,过多运用 lazy 实际上或许会产意想不到的过错。但有些啥时分,咱们或许想懒散地干事。因为 UI 总是在主线程上刷新,这使得它成为懒加载的一个很好的选项。

总结

lazy 咱们都很了解了,但在平常开发时,也不能为了用而用,仍是要依据实际情况,酌情运用。一起留意多线程的坑。