2016-12-16 89 views
0

我想創建一個AppSettings類來將用戶設置存儲在用戶字典中。我的AppSettings類:Swift Singleton類來存儲用戶設置

class AppSettings : NSObject 
{ 
    static var user: [String: Any]? 

    static let sharedSingleton : AppSettings = { 
     let instance = AppSettings() 
     return instance 
    }() 

    var userID: String? 
    var baseUrl: String? 

    override private init() { 

     super.init() 
     let userDefaults = UserDefaults.standard 

     AppSettings.user = userDefaults.object(forKey: "user") as! [String : Any]? 
     print(AppSettings.user ?? "User Defaults has no values") 

     self.saveSettings() 
    } 

    func saveSettings() 
    { 
     let userDefaults = UserDefaults.standard 

     if((AppSettings.user) != nil) 
     { 
      userDefaults.set(AppSettings.user, forKey: "user") 
     } 
     userDefaults.synchronize() 
    } 
} 

我這種方式存儲用戶的值:

AppSettings.user?["User_ID"] = String(describing: dictionary["User_ID"]) 
AppSettings.sharedSingleton.saveSettings() 

let defaults = UserDefaults.standard.object(forKey: "user") 
        print(defaults ?? "User is null") 

這表明,用戶爲空。怎麼了?

+0

當您打印它時,您的AppSettings.user是否有內容,或者您​​得到「用戶默認值沒有值」? –

+0

我得到「用戶默認值沒有值」。我無法添加值 –

+0

您從未爲關鍵「用戶」設置任何數據。您嘗試獲取對象,但是您從不設置它,因此它將返回零。當你試圖保存它時,你會檢查零,這總是零,所以你永遠不會保存它。所以你至少需要在某處初始化一個「用戶」對象。 –

回答

1

假設你的例子是完整的,問題就出在這行

AppSettings.user?["User_ID"] = String(describing: dictionary["User_ID"]) 

user變量是可選的,所以除非你創建一個空的字典第一,這是發生了什麼 - 如果user不爲零,分配鍵值爲"User_ID"

您只需在試圖向其添加值之前編寫AppSetting.user = [String:Any]()即可。現在,您似乎可以在init()中執行此操作,但是除非您致電sharedInstace,否則不會調用它。

在旁註中 - 如果您將此設置爲單例,爲什麼要將user變量作爲static公開?

+0

我不知道,爲什麼我把它變成靜態的。我現在在init()中調用'AppSetting.user = [String:Any]()'那麼我應該如何在其中添加值? –

+0

只要'init'在你訪問AppSetting.user之前運行,一切都會工作。 – Losiowaty

+1

最好的辦法是讓'user'不是'static'並將它作爲'AppSetting.sharedSingletion.user'來訪問 – Losiowaty