Swift 的 global variable / constant (全域變數/常數)

開發 iOS App 時,我們時常需要在不同的 controller 畫面間傳遞資料,也因為傳遞資料有許多不同的方法,所以初學者往往需要一段時間才能理解熟練這些技巧。

如果想讓 controller 讀取其它 controller 的資料,其實有一招很簡單的偷懶方法,宣告專案裡每個檔案都可存取的 global variable / constant。

此方法大神們會告訴我們最好少用,因為任何檔案皆可存取,到時候當變數內容出問題時,我們需要花很多時間研究,因為每個檔案都可能使用到它。

的確 global variable 最好少用。不過初學者剛開始開發 App 時,如果希望不同畫面的 controller 能夠存取同一份資料,也可以先用 global variable 實現。等未來學了更厲害的技術後,再改用更好的寫法。

在 Swift 裡要如何宣告 global variable 呢 ? 很簡單,只要在型別 { } 之外宣告,不被任何 { } 包圍,即可成為身份特別,大家都認識,每個檔案都可使用的 global variable。比方以下例子的 grade :

var grade = 0class QuestionViewController: UIViewController {   override func viewDidLoad() {      super.viewDidLoad()   }}

一旦宣告 { } 裡,它就無緣成為 global variable,比方以下例子的 number1, number2 & number3,分別被 class,func 和 if 的 { } 包含,因此不夠格當 global variable。

class QuestionViewController: UIViewController {   var number1 = 0   override func viewDidLoad() {      super.viewDidLoad()      var number2 = 0      if number2 > 0 {         var number3 = 0      }   }

接下來讓我們以選擇題 App 為例,實際瞧瞧 global variable 的應用。兩個畫面分別為 QuestionViewController & GradeViewController。我們可宣告 global variable grade,在 QuestionViewController 回答問題時增加 grade 的分數,然後在 GradeViewController 讀取 grade 顯示分數。

左邊是 QuestionViewController,右邊是 GradeViewController

QuestionViewController

宣告 global variable 的 var grade = 0 寫在 QuestionViewController,不過其實要寫在 GradeViewController 也可以,因為它是任何檔案皆可存取的 global variable,所以寫在哪個檔案都可以。

假設答對時會呼叫 answerCorrect(),答錯時會呼叫 answerWrong() 調整 grade 的分數。

var grade = 0class QuestionViewController: UIViewController {   func answerCorrect() {      grade = grade + 10   }   func answerWrong() {      grade = grade - 10   }

GradeViewController

class GradeViewController: UIViewController {   @IBOutlet var gradeLabel: UILabel!   override func viewDidLoad() {      super.viewDidLoad()      gradeLabel.text = grade.description   }

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com