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
宣告 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 }