首页 > 解决方案 > 为什么我可以定义一个静态常量,它依赖于同一类型的另一个静态常量,而不是属性?

问题描述

我熟悉在self初始化所有属性之前尝试访问时遇到错误。我从来不明白的一件事是,为什么我可以初始化static依赖于其他static属性的常量type而不会出现任何错误。

这种行为的原因是什么?为什么定义static常量不会给我编译时错误而属性常量会?

一些代码:

struct MyStruct {
    static let myStatic = 1
    // No error on this line...
    static let myStaticPlusOne = myStatic + 1

    let myInstance = 1
    // ... But a compile time error on this one! What makes the difference?
    let myInstancePlusOne = myInstance + 1
}

必须有一段时间将此结构加载到内存中,或者在某个时候加载静态变量。我看到这个时间与创建一个新实例的时间完全相同type。我无法清楚地看到这两者之间的区别。两者都有一个属性被初始化而另一个没有被初始化的时间。为什么我仍然可以从另一个静态变量访问我的静态变量?

标签: swiftstatic-variables

解决方案


类型和实例。

  • MyStruct 类型始终存在。static属性属于类型。所以他们只是坐在那里,可以做任何他们喜欢或以任何方式与之相关的事情。好的,是的,它必须在程序启动时存在,但在后台,静态属性初始化器都是lazy如此,因此可以依赖另一个(当然不是循环方式)。

  • MyStruct 的实例是必须创建的东西,每次你说MyStruct(...). 当您这么说时,必须初始化实例属性。实例(非static)属性属于该实例。所以它的初始化器的值不能引用,self因为self正是我们在创建的中间,即实例。这一行:

    let myInstancePlusOne = myInstance + 1
    

    ...真正意思

    let myInstancePlusOne = self.myInstance + 1
    

    ...但这正是你不能说的;在你初始化这个属性的时候还没有self,它就是你正在初始化的。您可以通过声明该属性lazy(在语法中进行其他调整)来解决此问题。


推荐阅读