首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >全局变量/常量是如何迅速懒惰的?

全局变量/常量是如何迅速懒惰的?
EN

Stack Overflow用户
提问于 2020-04-16 18:37:06
回答 1查看 341关注 0票数 0

来自docs.swift.org

全局变量

全局常量和变量总是以与延迟存储的属性类似的方式延迟计算。与延迟存储的属性不同,全局常量和变量不需要使用延迟修饰符标记。

类型属性

存储的类型属性在其第一次访问时被延迟初始化。

因此,我测试他们两个的懒惰性,如下所示

代码语言:javascript
运行
复制
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

因此,类型属性延迟初始化,但全局变量不是延迟初始化的。那么它到底意味着什么呢?全局变量/常量是延迟计算的。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-04-16 21:54:05

根据您链接的论坛线程,main.swift的作用域类似于Swift游乐场的作用域,在顶层声明的变量被视为局部变量而不是全局变量。

在您的示例中,s是一个局部变量,因此它不是延迟初始化的。

创建一个新文件,并且只在那里声明s (我更改了名称以便更清楚):

代码语言:javascript
运行
复制
// otherFile.swift

import Foundation

let globalS = Date()

然后在你的主旋律里:

代码语言:javascript
运行
复制
// 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)")

这应该打印如下的内容:

代码语言:javascript
运行
复制
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的顶级作用域与函数一样是本地作用域,而其他文件中的顶级作用域是全局作用域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61257581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档