当前位置: 首页 > 面试题库 >

Swift中的隐式惰性成员

吴高畅
2023-03-14
问题内容

我只是注意到staticSwift的成员structs是隐式的lazy

例如,这只会调用init一次:

class Baz {
    init(){
        print("initializing a Baz")
    }
}
struct Foo {
    static let bar = Baz()
}

var z = Foo.bar
z = Foo.bar

这背后的原理是什么?

如果我想要相反的行为怎么办?


问题答案:

static属性定义了一个“类型属性”,该属性仅被实例化一次。正如您所注意到的,这是懒惰发生的,因为静态行为就像全局变量一样。正如Swift编程语言:属性所说:

全局常量和变量总是以与惰性存储属性类似的方式延迟计算。与惰性存储的属性不同,全局常量和变量不需要用lazy修饰符标记。

这种隐式的懒惰行为是因为,正如Swift博客:文件和初始化所说:

它允许自定义初始化程序,Swift中的启动时间可以干净地缩放,而无需全局初始化程序来降低它的速度,并且执行顺序是完全可预测的。

他们有意识地设计了这种方式,以避免不必要地延迟应用程序的启动。

如果要static在应用程序中的某个特定位置实例化该属性(而不是将其推迟到首次使用该static属性的位置),只需在较早的时间点引用该属性,该对象将在该时间初始化。考虑到我们为减少启动应用程序的延迟所做的努力,您通常不会在应用程序的首次启动期间同步地希望这样做,但是您可以在任何地方进行。



 类似资料:
  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 问题内容: 初始化的优点或区别是什么? 而不是简单地使用: (是:) 非常感谢您的帮助。 问题答案: 惰性存储属性vs存储属性 具有惰性属性而不是存储属性有一些优点。 仅当您读取该属性时,才执行与lazy属性关联的闭包。因此,如果出于某种原因未使用属性(可能是由于用户的某些决定),则可以避免不必要的分配和计算。 您可以使用存储属性的值填充惰性属性。 您可以在内部使用惰性属性关闭

  • 在Swift 4.1之前,我使用从集合中删除值。现在此方法已弃用,我需要将其替换为。有时我使用带有惰性集合的来优化我的代码,如下所示: 如果我使用而不是,它会有相同的效果吗?在方法的留档中,我找到了对和的引用。

  • 延迟初始化 是一种允许我们延迟初始化消耗资源比较大的进程,直到需要他们的时候(才初始化)。这其中的一个例子就是jQuery的.ready()方法,它在DOM节点加载完毕之后会执行一个回调方法。 $( document ).ready( function () { //ajax请求不会执行,直到DOM加载完成 var jqxhr = $.ajax({ url: "ht

  • 问题内容: 也许这个问题需要一些上下文。 我一直在使用Core Data在持久层上进行工作,发现Core Data不是线程安全的,因此仅需要限制在每个线程中。 因此,我的方法是创建自定义后台线程,以执行获取,保存等操作,同时还要创建主线程,该线程将用于从获取的线程中获取并将其传递给调用者方法。 默认情况下,Xcode的生成与核心数据模板的代码中使用的所有,等等。 所以我的问题是是否 使用实例化方法

  • 所谓Futures就是指:有时候在你使用某一个值之前需要先对其进行计算。这种情况下,你就可以在另一个处理器上进行该值的计算,到使用时,该值就已经计算完毕了。 Futures模式通过闭包和通道可以很容易实现,类似于生成器,不同地方在于Futures需要返回一个值。 参考条目文献给出了一个很精彩的例子:假设我们有一个矩阵类型,我们需要计算两个矩阵A和B乘积的逆,首先我们通过函数Inverse(M)分别