2016-01-06 22 views
4

我最近在Lynda.com上观看了video tutorial,我发现作者声明了一些包含两个类实例的全局变量。我的问题的主要原因是因为我听说我们需要尽量避免使用全局变量,除非您真的需要它们。我可以看到使用全局变量NSUserDefaults' Keys,但我不确定全局实例。在Swift/iOS中声明全局类实例是否很常见/ OK

这是显示全局变量声明的代码。我只关心变量masterViewdetailViewController

import UIKit 

var objects:[String] = [String]() 
var currentIndex:Int = 0 

var masterView:MasterViewController? 
var detailViewController:DetailViewController? 

let kNotes:String = "notes" 
let BLANK_NOTE:String = "(New Note)" 

class MasterViewController: UITableViewController { 

    // class code 

} 

可以将您的类实例声明为全局变量吗?

+2

我还没有看过视频,但这可能仅用于学习(即在游乐场)?在Playground中,所有不属于闭包(类,结构,函数)的变量本身就是“Playground global”。通常,我们希望避免全局变量(如您所说),包括类实例。 – dfri

回答

5

从技术的角度来看,在你的Swift代码中使用全局变量当然是可以的,因为你的程序不会崩溃或以其他方式“不合适”。在为演示构建一个快速示例时,全局变量提供了一种简化代码的简便方法。

但是,使用可变全局变量有一些缺点,使得它们的使用有问题。具体来说,他们打破封装。看着您提供的代码,这两个变量

var objects:[String] = [String]() 
var currentIndex:Int = 0 

应该被隐藏在一个模型对象,在其中您有一定程度的控制。

如果您不清楚它们的使用情况,使用全局变量可能会产生一些意外的行为。例如

var masterView:MasterViewController? 
var detailViewController:DetailViewController? 

可能会保留对不再可见的视图控制器的引用。

+0

我明白,为了快速演示,它会让你的代码更清洁,但我不确定是否显示不好的做法是一个好主意,因为本教程是关于创建一个'Notes应用程序',我看到它的主要原因是看看代码应该在真实应用程序中构建。正如你我也注意到他添加的可变变量,我知道可能会导致问题,但我不确定全局实例是否普遍。你知道任何教程,其中的应用程序是在良好的编程模式下创建的吗? –

+1

@fs_tigre我同意,演示应该努力在实践中使用最佳实践。另一方面,构建应用程序的演示将非常困难,因为需要太多的零件。我不知道任何这样的演示或教程。对于我来说,关于构建我的应用的高层次结构的最有用的解读是苹果的[MVC讨论](https://developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller /Model-View-Controller.html#//apple_ref/doc/uid/TP40010810-CH14)。 – dasblinkenlight

+0

感谢您的链接,它看起来像一个很好的参考。 –

2

如果您希望仅在整个应用程序工作中只使用该类的一个实例,那么可以将类实例声明为全局变量。
注:你可以通过这些私人,你不希望被全局实例变量来访问隐藏这些特性该实例的&功能。