Swift静态属性初始化器是懒惰的,为什么我可以将它声明为常量

时间:2017-02-24 17:08:54

标签: swift initialization

据我所知(参见参考文献A),静态属性启动器是惰性的,我在office documents

找到了以下描述
  

您必须始终将惰性属性声明为变量(使用var   关键字)因为它的初始值可能直到之后才被检索   实例初始化完成。常量属性必须始终   在初始化完成之前有一个值,因此不能   宣称是懒惰的。

从上面的信息来看,我认为我无法将静态属性定义为常量变量而且我进行了试用,结果证明我可以做到这一点而不会触发编译器的任何错误。

示例:

class Person {
    static let firstNaID = "First Name"
    static let lastNaID = "Last Name"
}

问题:这是Swift 3.0.1的错误还是我错了。

参考A :Neuburg。 M.2016。 IOS 10使用Swift编程基础。 P127

感谢您的时间和帮助

2 个答案:

答案 0 :(得分:2)

Neuburg M.在静态属性和实例属性之间是drawing a distinction。你假装忽略这种区别。但你不能忽视它;它们是完全不同的东西,用于不同的目的。

在此代码中:

class Person { // let's declare a static property
    static let firstNaID = "First Name"
}

... firstNaID 已经懒惰。但现在尝试这样做:

class Person { // let's declare an instance property
    lazy let firstNaID : String = "First Name" // error
}

你不能;事情就是这样(通过Swift 3.1),你不得不说lazy var - 当你这样做时,你得到一个懒惰的实例属性。

因此,static let声明无法完成lazy let想要完成的任务,因为静态属性不是实例属性。

答案 1 :(得分:1)

您正在谈论类型属性

形成documentation

的相同章节
  

输入属性

     

...类型属性对于定义对特定类型的所有实例都是通用的值很有用,例如所有实例都可以使用的常量属性...

     

存储的类型属性可以是变量或常量。计算类型属性始终声明为变量属性,与计算实例属性的方式相同。

     

请注意

     

...

     

存储类型属性在首次访问时会被懒惰地初始化。它们只保证初始化一次,即使同时由多个线程访问,也不需要使用延迟修饰符标记