何时在 Swift 中使用全局变量

When to use global variables in Swift

我正在学习 Swift 和 iOS 应用程序开发,我想知道在哪些情况下(如果有的话)我应该在 iOS 应用程序中使用全局变量和常量.

Global variables are variables that are defined outside of any function, method, closure, or type context. Local variables are variables that are defined within a function, method, or closure context.

使用全局变量通常看起来不雅且不可取(实际上大多数指南和教程都不推荐)并且在视图控制器之间传递数据我使用 prepareForSegue(_: sender:) 方法。

但在某些情况下,在我看来,使用全局变量会使代码更简单、更快。

例如,Apple 建议为每个格式模式存储 NSDateFormatterNSNumberFormatter,而不是在每次需要时都重新创建或更改。在我正在开发以学习该语言的应用程序中,大多数视图控制器都使用 NSDateFormatterNSNumberFormatter 并且为每个视图控制器创建一个新视图控制器可能不是一个好主意。我可以使用 prepareForSegue 传递它,但我认为在这种情况下,最好使用一个全局变量来保存每个视图控制器都可以使用的格式化程序实例。

那么在某些情况下我应该使用全局变量吗?

每次您发现自己在使用全局变量时,都需要退后一步,认真思考数据是什么以及它与应用程序的其余部分有何关系。说你需要避免全局变量很容易,困难的部分是了解场景的最佳替代方案,即使是经验丰富的 Cocoa 开发人员也不同意这一点。

单例模式 中,您创建一个 class 并将您的全局存储在其中。这通常作为解决方案提供,因为它最容易规定和遵循,但很多时候我想知道它是否是一个解决方案。将 class 包裹在全局范围内不会给您任何额外的保护。毕竟,class 本身现在是一个全球实体。我喜欢将单例模式视为一种组织、分类和包含全局变量的方式,而不是避免使用全局变量。

单例应保留给应用程序的支柱,例如数据库或远程后端连接处理程序。每个 Cocoa/CocoaTouch 应用程序都带有一个内置的 Singleton,即 AppDelegate,在许多情况下,各种各样的东西都可以放在那里。

在许多情况下,"correct" 解决方案是传递数据,例如在 prepareForSegue: [=31] 中的视图控制器之间传递数据=].这在 Andy Matuschak 精彩的 WWDC 2014 session、Advanced iOS Application Architecture and Patterns 中有详细描述。不过,我同意您的看法,这不适用于您的示例。在您的示例中,您没有在两个视图之间处理相关数据,而是试图共享一个公共设施以节省资源。

对于您的具体示例,我会使用 Singleton 或类似模式。对我来说有意义的一种方法是使用扩展将它们存储在相应的 classes 中。例如:

extension NSDateFormatter {
  static let newDateFormatter = NSDateFormatter()
}

// use it in your app like this:
NSDateFormatter.newDateFormatter

如评论者所说,见仁见智。还要记住,Swift 还很年轻,虽然出于必要它大量借鉴了 Cocoa,但习语仍在不断发展。