※ 引述《mick99988 (高雄人)》之銘言:
: 原本是寫C#剛跳過來寫Swift
: 遇到一些疑問比如說
: 在C#我可以宣告一個靜態類別
: public static class csGlobal
: {
: public static int i = 0;
: }
: 比如在程式內我會存取一個靜態類別內的共用變數好了
: 這樣在其他不同頁面我也能去檢查這變數狀態,csGlobal.i == 1 blabla來做後續邏輯
: 。
: 但在Swift可以這樣用嗎?還是有另外寫法呢?
你可以寫一個singleton物件來存取這個狀態,
以swift來說大概會長得像:
class MyStateController {
private init() {
//your initialization
}
static let shared = MyStateController()
}
或者你可以存在一個內建的singleton物件: AppDelegate。
(事實上被做成singleton的是UIApplication)
(另外關於這樣存是看習慣,有些人是不建議這樣存)
假設你在你的AppDelegate類別宣告一個狀態變數
eg. var isLoggedIn: Bool = false
你可以透過這樣的方式在其它地方存取它:
func login() {
// do your login
// ...
let app = UIApplication.shared
// UIApplication's singleton object
let appDelegate = app.delegate! as! AppDelegate
// force unwrapp and cast is safe, generally
appDelegate.isLoggedIn = true //user logged in
// or just call:
(UIApplication.shared.delegate! as! AppDelegate) = true
}
關於singleton在swift的宣告方式可以參考:
https://krakendev.io/blog/the-right-way-to-write-a-singleton
: 就是在"不同的Controller之間都能共用變數"或是靜態類別的寫法
: 有像C# 宣告public static class Golbal{...}寫法?
: 因最近有Firebase相關的存取問題
: EX:
: 我的主進入點是Tab bar Controller,下方有兩個分頁
: 然後我在主頁面內有FIRAuth.auth()?.addStateDidChangeListener()監聽器去判斷是否
: 登入,假如有登入了我會在主頁面user = FIRUser表示有人資料。
: 然後下面是我想問的
: 我在第二分頁的TableViewController的Cell上會寫類似一般APP都會有的"登出"按鈕,
: 但問題就在這邊,我在另一個分頁的Controller,又如何得知到主頁面上變數user的資訊
: ...?
上面的說明應該回答了這個問題
: 才能用這段
: if user != nil
: {
: try! FIRAuth.ayth()!.signout()
: user = nil
: }
: 最後偷渡問一下
: AppDelegate.swift 這頁面大多功用是在做什麼的阿?
: 我本來依名字以為是所有委託都寫在這邊 但好像不是?
事實上AppDelegate繼承自UIApplicationDelegate,
顧名思義就是你的整個應用程式的delegate。
也就是當某些應用程式級別的事情發生的時候,讓你有些機會做些處置。
更多細節建議參考蘋果的官方文件:
https://developer.apple.com/reference/uikit/uiapplicationdelegate