在NSUserDefaults中存储字典并使用存储的数据.

Jae*_*Jae 5 nsdictionary nsuserdefaults ios swift

我一直在努力解决这个问题5天.可不是闹着玩的.请帮忙!这是我遇到的问题.

我知道的:

我宣布var addressDict = Dictionary<Int, Array<String>>()为全局变量.现在,我了解下面的代码用于附加存储在addressDict中的数据并更改类型,以便将数据存储到NSUserDefaults中.

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
     let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
}
Run Code Online (Sandbox Code Playgroud)

现在,每次运行应用程序时,存储的数据addressDict2都会被我覆盖,addressDict因为当应用程序启动时,没有数据存在addressDict.因此即使我可能已经添加了一些数据addressDict2,它也会被覆盖,addressDict因为它没有数据.

所以为了解决这个问题,我可以运行上面的代码,但没有行,self.defaults.setObject(data, forKey: "addressDict")现在,addressDict2不再被不包含数据的变量覆盖了addressDict.所以我追加的数据存储在addressDict2.但是,如果我这样做,我就不能再添加新信息,addressDict2因为我已经self.defaults.setObject(data, forKey: "addressDict")没有了.我希望你能在这里看到我的困境......

我想知道的:

这就是我希望我的代码要做的事情.我希望能够将新信息附加到某个变量中addressDict2.当应用程序启动时,我希望将addressDict2要复制的数据复制到其中addressDict.因此,这将导致addressDict保存我希望它保留的数据.

我尝试过的:

为了试图解释我的意思,这里有一些代码.请注意,这段代码不起作用,只是为了澄清我的意思,并表明以下代码是否有效,它会解决我的问题,我想(如果我错了请纠正我).所以在我viewDidLoad(),我会如下:

override func viewDidLoad() {
    super.viewDidLoad()

    if NSUserDefaults.standardUserDefaults().objectForKey("addressDict") != nil {
        if let data2 = defaults.objectForKey("addressDict") as? NSData { 
            addressDict = NSKeyedUnarchiver.unarchiveObjectWithData(data2) //there is an error here that states: "Cannot assign a value of type AnyObject? to a value of type Dictionary<Int, Array<Strings>>
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在,当我运行这段代码时:

let data = NSKeyedArchiver.archivedDataWithRootObject(addressDict) //archiving
self.defaults.setObject(data, forKey: "addressDict") //storing
if let data2 = self.defaults.objectForKey("addressDict") as? NSData { 
     let addressDict2 = NSKeyedUnarchiver.unarchiveObjectWithData(data2)
}
Run Code Online (Sandbox Code Playgroud)

addressDict这里将不再是空的,不会覆盖addressDict2数据为空.我将能够使用addressDict所有永久存储的数据!生活将是美好的.但我不知道该怎么做.

PS我对这个问题的长度深表歉意.感谢您的时间!

小智 1

将数据保存到字典中时:

let foundationDictionary = NSMutableDictionary(dictionary: StoreDictionary) let dict = NSKeyedArchiver.archivedDataWithRootObject(foundationDictionary) NSUserDefaults.standardUserDefaults().setObject(dict, forKey: "yourkey")
Run Code Online (Sandbox Code Playgroud)

使用保存的数据时:

if NSUserDefaults.standardUserDefaults().objectForKey("UserDetails")!=nil {

let dict : NSData = NSUserDefaults.standardUserDefaults().objectForKey("yourkey") as! NSData dictionaryName = NSKeyedUnarchiver.unarchiveObjectWithData(dict) as? NSDictionary
}
Run Code Online (Sandbox Code Playgroud)