全局变量
全局常量和变量总是以与延迟存储的属性类似的方式延迟计算。与延迟存储的属性不同,全局常量和变量不需要使用延迟修饰符标记。
类型属性
存储的类型属性在其第一次访问时被延迟初始化。
因此,我测试他们两个的懒惰性,如下所示
import Foundation
import CoreFoundation
var s = Date()
struct Sam {
static let s = Date()
}
print(Date())
Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false, block: { (t) in
print(Sam.s)
print(s)
exit(0)
})
CFRunLoopRun()我不是在操场上跑的。一个来自forums.swift.org的人建议不要在操场上跑。
所以我将它存储在一个名为main.swift的文件中,然后使用swift main.swift运行它。
It输出如下
2020年-04-16 18:23:48 +0000 2020年-04-16 18:23:50 +0000 2020年-04-16 18:23:48 +0000
因此,类型属性延迟初始化,但全局变量不是延迟初始化的。那么它到底意味着什么呢?全局变量/常量是延迟计算的。
提前谢谢。
发布于 2020-04-16 21:54:05
根据您链接的论坛线程,main.swift的作用域类似于Swift游乐场的作用域,在顶层声明的变量被视为局部变量而不是全局变量。
在您的示例中,s是一个局部变量,因此它不是延迟初始化的。
创建一个新文件,并且只在那里声明s (我更改了名称以便更清楚):
// otherFile.swift
import Foundation
let globalS = Date()然后在你的主旋律里:
// main.swift
import Foundation
struct S {
static let classS = Date()
}
let localS = Date()
print("Reference date: \(Date())")
sleep(2)
print("Local var s date: \(localS)")
print("Global var s date: \(globalS)")
print("Class property date: \(S.classS)")这应该打印如下的内容:
Reference date: 2020-04-16 21:47:47 +0000
Local var s date: 2020-04-16 21:47:47 +0000
Global var s date: 2020-04-16 21:47:49 +0000
Class property date: 2020-04-16 21:47:49 +0000本地变量具有与参考时间相同的时间,因此它被急切地初始化。静态变量和全局变量是两秒钟后,证明它们在调用时被延迟地实例化。
这说明了全局变量和局部变量之间的区别: main的顶级作用域与函数一样是本地作用域,而其他文件中的顶级作用域是全局作用域。
https://stackoverflow.com/questions/61257581
复制相似问题