2016-01-06 21 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

如果您希望僅在整個應用程序工作中只使用該類的一個實例,那麼可以將類實例聲明爲全局變量。
注:你可以通過這些私人,你不希望被全局實例變量來訪問隱藏這些特性該實例的&功能。