【发布时间】:2017-07-06 04:42:18
【问题描述】:
Swift 中的全局变量和共享实例有什么区别?它们各自的使用领域是什么?谁能根据 Swift 阐明他们的概念。
【问题讨论】:
Swift 中的全局变量和共享实例有什么区别?它们各自的使用领域是什么?谁能根据 Swift 阐明他们的概念。
【问题讨论】:
全局变量是在文件顶层声明的变量。因此,如果我们有一个名为 Bar 的类,您可以在全局变量中存储对 Bar 实例的引用,如下所示:
var bar = Bar()
然后您就可以从任何地方访问该实例,如下所示:
bar
bar.foo()
共享实例或单例,如下所示:
class Bar {
static var shared = Bar()
private init() {}
func foo() {}
}
然后您可以访问共享实例,仍然可以从模块中的任何位置访问,如下所示:
Bar.shared
Bar.shared.foo()
然而,两者之间最重要的区别之一(除了全局变量通常不被鼓励)是单例模式限制您创建Bar 的其他实例。在第一个示例中,您可以创建更多全局变量:
var bar2 = Bar()
var bar3 = Bar()
但是,使用单例(共享实例),初始化程序是私有的,所以尝试这样做...
var baaar = Bar()
...结果如下:
由于“私有”保护级别,无法访问“Bar”初始化程序
这是一件好事,因为单例的意义在于有一个 single 共享实例。现在,您可以访问Bar 实例的唯一方法是通过Bar.shared。请务必记住在类中添加 private init(),但不要添加任何其他初始化程序,否则将不再强制执行。
如果您想了解更多信息,请阅读 KrakenDev here 撰写的精彩文章。
【讨论】:
Swift中你可以声明initfileprivate并将全局变量的声明放到同一个文件中,描述的差异就消失了。您有 global variable 并且无法再创建该类型的任何实例,因为无法访问 init。
单例(共享实例)
确保只创建一个单例对象的实例,它提供了一个可通过对象的共享实例全局访问的对象,该对象甚至可以跨应用程序共享。
dispatch_once 函数,执行一次块,only once for the lifetime of an app。
全局变量
Apple 文档说全局变量是定义为 outside of any function, method, closure, or type context 的变量。
【讨论】: