何时在Swift

时间:2015-12-26 22:40:38

标签: ios swift global-variables global

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

  

全局变量是在任何函数,方法,闭包或类型上下文之外定义的变量。局部变量是在函数,方法或闭包上下文中定义的变量。

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

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

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

那么我是否应该使用全局变量?

1 个答案:

答案 0 :(得分:7)

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

单例模式中,您可以创建一个类并将其全局存储在其中。这通常作为解决方案提供,因为它是最容易开处方和遵循的,但很多时候我不知道它是否是一个解决方案。围绕全球包装课程并不能为您提供任何额外的保护。毕竟,班级本身现在是一个全球性的实体。我喜欢将Singleton模式看作是一种组织,分类和包含全局变量的方法,而不是避免使用全局变量。

应该为您的应用程序的帐篷保留单身人士,例如数据库或远程后端连接处理程序。每个Cocoa / CocoaTouch应用程序都带有一个内置的Singleton,AppDelegate,在很多情况下,各种各样的东西可以去那里。

在许多情况下,"正确"解决方案是传递数据,例如在prepareForSegue:类中的视图控制器之间传递数据。这在Andy Matuschak辉煌的WWDC 2014会议Advanced iOS Application Architecture and Patterns中得到了很好的描述。我同意你的看法,这并不适用于你的例子。在您的示例中,您不会在两个视图之间处理相关数据,而是尝试共享公共工具来保存资源。

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

extension NSDateFormatter {
  static let newDateFormatter = NSDateFormatter()
}

// use it in your app like this:
NSDateFormatter.newDateFormatter
像评论者说的那样,这是一个意见问题。还要记住,斯威夫特仍然很年轻,虽然它必然会从可可中大量借用,但成语仍在不断发展。