swift - 为什么我可以定义一个静态常量,它依赖于同一类型的另一个静态常量,而不是属性?
问题描述
我熟悉在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
。我无法清楚地看到这两者之间的区别。两者都有一个属性被初始化而另一个没有被初始化的时间。为什么我仍然可以从另一个静态变量访问我的静态变量?
解决方案
类型和实例。
MyStruct 类型始终存在。
static
属性属于类型。所以他们只是坐在那里,可以做任何他们喜欢或以任何方式与之相关的事情。好的,是的,它必须在程序启动时存在,但在后台,静态属性初始化器都是lazy
如此,因此可以依赖另一个(当然不是循环方式)。MyStruct 的实例是必须创建的东西,每次你说
MyStruct(...)
. 当您这么说时,必须初始化实例属性。实例(非static
)属性属于该实例。所以它的初始化器的值不能引用,self
因为self
正是我们在创建的中间,即实例。这一行:let myInstancePlusOne = myInstance + 1
...真正意思
let myInstancePlusOne = self.myInstance + 1
...但这正是你不能说的;在你初始化这个属性的时候还没有
self
,它就是你正在初始化的。您可以通过声明该属性lazy
(在语法中进行其他调整)来解决此问题。
推荐阅读
- fiware - 有没有办法(批量)删除 Fiware Orion 中的所有订阅?
- excel - 如何在 VBA 中将 QR 码添加为来自 OLEobjects 的图像
- php - 如何检查 cron 执行过程中的 db 连接是否失败 - ubuntu- php -yii?
- python - 卡夫卡消费者:我一遍又一遍地收到相同的消息,好像没有提交我已经阅读过的内容
- python - 如何在conda环境下安装keras 2.0.5版本
- reactjs - 为什么无法在 react 中使用 useHook 访问另一个组件中的状态?
- jvm - JVM 似乎挂起并出现 Outofheapspace 错误,而 Mule 4 中的响应负载大小超过 3 mb
- docker - 无法通过公共 ip 访问 docker 容器
- javascript - 节点js,函数不等待响应
- r - x 轴上带有时间的华夫饼图