全局变量 vs 共享实例 Swift

8
什么是全局变量和共享实例,在Swift中它们各自的使用领域有什么区别?能否根据Swift概述它们的概念。

https://dev59.com/bVwY5IYBdhLWcg3waXEF - Jaydeep Vyas
2个回答

10

全局变量是在文件的顶层声明的变量。因此,如果我们有一个名为Bar的类,您可以像这样在全局变量中存储对 Bar 实例的引用:

var bar = Bar()

然后您就可以从任何地方访问该实例,像这样:

bar
bar.foo()

一个共享实例,或单例,看起来像这样:

class Bar {
    static var shared = Bar()
    private init() {}
    func foo() {}
}

然后,您可以从模块中的任何位置访问共享实例,像这样:

Bar.shared
Bar.shared.foo()

不过,除了全局变量普遍不被推荐之外,Singleton模式与其最重要的区别之一是它限制了你创建其他Bar实例的能力。在第一个示例中,你可以创建更多的全局变量:

var bar2 = Bar()
var bar3 = Bar()

然而,如果使用单例(共享实例),则初始化器是私有的,因此尝试这样做会出现问题...

var baaar = Bar()

...结果是这样的:

'Bar'初始化器由于私有保护级别而不可访问

这是一件好事,因为单例的目的在于存在一个 唯一的 共享实例。现在您唯一能够访问Bar的实例就是通过Bar.shared。请记住在类中添加 private init(),并且不添加任何其他初始化器,否则将不再强制执行。

如果您想了解更多信息,则可以阅读KrakenDev的一篇很棒的文章here


Swift中,您可以将init声明为fileprivate并将全局变量的声明放入同一文件中,这样描述的差异就消失了。您有一个全局变量,不能创建该类型的任何其他实例,因为init是不可访问的。 - user28434'mstep
没错,那是另一个选项。据我所知,我描述的是Swift中单例或共享实例的典型模式。 - Søren Mortensen

-2

单例模式(共享实例)

确保只创建一个单例对象的实例,并提供全局访问该对象的共享实例,即使在整个应用程序中也可以共享。 使用dispatch_once函数执行一次块,仅在应用程序的生命周期内执行一次

全局变量

苹果文档称全局变量是定义在任何函数、方法、闭包或类型上下文之外的变量。


1
那些不是全局变量。你引用了文档中说全局变量是在任何类型上下文之外定义的,然后在类型内声明了你的“全局变量”。 - Søren Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接