2016-12-16 47 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