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

时间:2015-09-02 12:50:57

标签: ios swift nsdictionary nsuserdefaults

我一直在努力解决这个问题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)
}

现在,每次运行应用时,addressDict2中存储的数据都会被addressDict覆盖,因为当应用启动时,addressDict中没有数据。因此,即使我可能已将某些数据附加到addressDict2,但它会被addressDict覆盖而没有数据。

因此,为了解决这个问题,我可以运行上面的代码但没有行self.defaults.setObject(data, forKey: "addressDict"),现在,addressDict2不再被不包含数据的变量覆盖{ {1}}。所以我追加的数据存储在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>>
        }
    }
}

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) } 此处将不再为空,并且不会使用空数据覆盖addressDict。我将能够将addressDict2与所有永久存储的数据一起使用!生活将是美好的。但我不知道该怎么做。

P.S。我对这个问题的长度深表歉意。谢谢你的时间!

1 个答案:

答案 0 :(得分:1)

将数据保存到字典中时

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

使用保存的数据时:

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

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