我正在学习Swift和iOS应用程序的开发,我想知道在哪些情况下(如果有的话)我应该在iOS应用程序中使用全局变量和常量。
全局变量是在任何函数、方法、闭包或类型上下文之外定义的变量。局部变量是在函数、方法或闭包上下文中定义的变量。
使用全局变量通常看起来不雅且不可取(事实上,大多数指南和教程都不建议使用全局变量),并且为了在视图控制器之间传递数据,我使用prepareForSegue(_: sender:)
方法。
然而,在某些情况下,在我看来,使用全局变量会使代码更简单、更快。
例如,苹果建议为每个格式模式存储一个NSDateFormatter
或NSNumberFormatter
,而不是每次需要时都重新创建或更改一个。在我为学习该语言而开发的应用程序中,大多数视图控制器都使用NSDateFormatter
和NSNumberFormatter
,为每个视图控制器创建一个新的视图控制器可能不是一个好主意。我可以用prepareForSegue传递它,但我认为在这种情况下,也许使用一个全局var来保存每个视图控制器都可以使用的格式化程序实例会更好。
那么,在任何情况下,我都应该使用全局变量吗?
每次你发现自己在使用全局数据时,你都需要退后一步,认真思考数据是什么,以及它与应用程序的其他部分之间的关系。很容易说你需要避免全局性,困难的部分是知道场景的最佳替代方案,即使是资深的Cocoa开发人员也会不同意。
在singleton模式中,您创建一个类并将全局存储在其中。这通常是作为解决方案提供的,因为它最容易规定和遵循,但很多时候我想知道它是否是一个解决方案。将一个类封装在全局中不会给你任何额外的保护。毕竟,类本身现在是一个全局实体。我喜欢把Singleton模式看作是一种组织、分类和包含全局变量的方式,而不是避免全局变量。
应该为应用程序的帐篷(如数据库或远程后端连接处理程序)保留Singleton。每个Cocoa/CooaTouch应用程序都有一个内置的Singleton,即AppDelegate,在许多情况下,各种各样的东西都可以放在那里。
在许多情况下,"正确"的解决方案是传递数据,例如在prepareForSegue:
类中的视图控制器之间传递数据。这在Andy Matuschak精彩的WWDC 2014会议《高级iOS应用程序架构和模式》中有很好的描述。不过,我同意你的观点,这不适用于你的例子。在您的示例中,您没有在两个视图之间处理相关数据,而是试图共享一个公共设施来保存资源。
对于您的具体示例,我将使用Singleton或类似的模式。对我来说有意义的一种方法是使用扩展将它们隐藏在相应的类中。例如:
extension NSDateFormatter {
static let newDateFormatter = NSDateFormatter()
}
// use it in your app like this:
NSDateFormatter.newDateFormatter
正如评论人士所说,这是一个意见问题。请记住,Swift还很年轻,尽管它出于必要大量借用了Cocoa,但习语仍在不断发展。