【问题标题】:Global var vs Shared Instance swift全局变量与共享实例 swift
【发布时间】:2017-07-06 04:42:18
【问题描述】:

Swift 中的全局变量和共享实例有什么区别?它们各自的使用领域是什么?谁能根据 Swift 阐明他们的概念。

【问题讨论】:

标签: swift instance global


【解决方案1】:

全局变量是在文件顶层声明的变量。因此,如果我们有一个名为 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
  • 没错,这是另一种选择。不过,据我所知,我所描述的是 Swift 中单例或共享实例的典型模式。
【解决方案2】:

单例(共享实例)

确保只创建一个单例对象的实例,它提供了一个可通过对象的共享实例全局访问的对象,该对象甚至可以跨应用程序共享。 dispatch_once 函数,执行一次块,only once for the lifetime of an app

全局变量

Apple 文档说全局变量是定义为 outside of any function, method, closure, or type context 的变量。

【讨论】:

  • 那些不是全局变量。你引用文档说全局变量是在任何类型上下文之外定义的,然后在类型中声明你的“全局变量”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-19
  • 2020-10-14
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 1970-01-01
相关资源
最近更新 更多