Swift静态属性启动器是懒惰的,为什么我可以将其宣布为常数



据我所知(请参阅参考文献A),静态属性启动器很懒惰,我通过Office文档找到了以下描述

您必须始终将懒惰的属性声明为变量(带有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

感谢您的时间和帮助

neuburg M.正在区分静态属性和实例属性。您假装忽略了这种区别。但是你不能忽略它;它们是完全不同的东西,用于不同的目的。

在此代码中:

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想要完成的工作,因为静态属性不是实例属性。

您在谈论 type properties

形成文档的同一章

类型属性

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

的恒定属性

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

注意

...

存储的类型属性在其第一个访问上懒惰地初始化。即使同时通过多个线程访问,它们也只能初始化一次,并且不需要用Lazy Modifier

标记它们。

最新更新