Swift中的惰性属性

Swift中的lazy关键字使您可以延迟存储属性的初始化,直到需要它为止 这种方法的好处是可以提高性能,因为如果不需要立即启动,可以避免启动过程中潜在的昂贵过程。

您可以将初始化视为分配具有初始值的变量。 一个对象可以具有属性,因此当我们初始化它时,它的属性也会被初始化。

定义惰性属性

您可以通过在var关键字前添加lazy来定义lazy属性 但是,您不能使用常数,因为惰性属性的值仅在初始化后才计算,而常数则需要一个值。

由于使用lazy关键字的目的是将代码执行延迟到初始化之前,因此,简单的自执行闭包是一个完美的用例。

让我们以下面的伪代码 为例

想象一下,我们有一个MathsHelper类,该类可用于计算Pi的值以及其他随机方程的集合。 如果只打算使用它们的一个子集,则无需计算此类中的所有属性。 通过在var前面加上lazy ,可以延迟此操作,直到需要它为止。

这种方法的另一个优点是,我们现在将此属性的声明和设置都放在一个位置。

我可以将计算属性声明为惰性吗?

不。 每次访问计算属性时都会重新计算,但是根据定义,在初始化时,惰性属性仅计算一次

这种方法有什么缺点吗?

附加了lazy关键字的var不是线程安全的。 这并不意味着多个线程在尝试访问其值时将创建多个实例,而是如果2个或更多线程尝试同时访问它,则第一个线程之后的任何线程都可能接收到该对象的部分初始化的实例。

在Swift本身中,有一个开放的错误可以解决此问题。

tl:dr?

  • lazy关键字用于延迟变量的初始化
  • 这可以帮助提高性能和启动时间
  • 但是,此行为不是线程安全的