【问题标题】:Initialization of properties in a class, lazy properties in specific?类中属性的初始化,具体是惰性属性?
【发布时间】:2015-11-29 12:09:25
【问题描述】:
  1. 在 swift 中,当我声明该类的实例时,该类中的属性是否已初始化?

  2. 惰性属性在被调用/使用之前不会被初始化(如果我错了,请纠正我),所以基本上声明一个类的实例不会初始化惰性属性,但会初始化常规属性(如果有) (我相信称为存储)?

  3. 最后,这本书说下面的实例是“声明的”和“初始化的”......我可以看到它被声明但它是如何被“初始化”的?括号之间没有参数被发送??

    let someClass = SomeClassWithLazyVar()
    

【问题讨论】:

    标签: swift properties initialization lazy-loading


    【解决方案1】:
    1. 是的,没错。
    2. 是的,这也是正确的。
    3. 正在初始化的是常量someClass声明是在你的程序中引入一个新的命名值。您声明常量(或变量)的名称并识别其类型,如下所示:

      let someClass: SomeClassWithLazyVar

    但此时它还没有被初始化。您可以通过为其赋值来初始化常量:

    someClass = SomeClassWithLazyVar()
    

    绝大多数时候(尤其是常量)你声明常量并同时初始化它:

    let someClass = SomeClassWithLazyVar()
    

    您是否需要在括号内传递参数取决于您正在创建的对象的初始化程序。我假设SomeClassWithLazyVar 有一个不带参数的初始化程序,如下所示:

    init() { }
    

    【讨论】:

    • 哥们你太棒了,非常感谢,解决了很多困惑!
    【解决方案2】:
    1. 是的(仅“常规”存储属性 - 这不适用于计算属性和惰性属性)。甚至只有在创建类的实际实例时才会分配默认值。

    2. 是的。苹果文档说:

    惰性存储属性是在第一次使用之前不计算初始值的属性。您可以通过在声明之前编写惰性修饰符来指示惰性存储属性。

    1. 您粘贴的是“构造函数调用”。当您编写name_of_class() 时,您实际上是在创建该类的一个实例(并在之后立即调用它的init() 方法)。因此,someClass 正在使用所述实例进行初始化。

    【讨论】:

    • 哦,好吧,“构造函数调用”是否与“初始化程序调用”相同,如果是,那么在谈到这样的主题时使用哪个术语更好?
    • 基本上是的。我想这两种表达方式都可以使用。 “构造函数调用”听起来更像 C++,但无论哪种方式你都会被理解。
    猜你喜欢
    • 2021-11-21
    • 2012-11-25
    • 2018-05-15
    • 1970-01-01
    • 2015-08-06
    • 2017-09-29
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    相关资源
    最近更新 更多