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

5
我已经为这个问题努力了5天。不开玩笑,请帮忙!以下是我遇到的问题。
我声明了一个全局变量var addressDict = Dictionary<Int, Array<String>>()。现在,我理解以下代码是用来将存储在我的地址字典中的数据追加并更改类型,以便可以将数据存储到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不再被一个不包含数据的变量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。我将能够使用addressDict与所有永久存储的数据!生活将变得美好。但是我不知道如何做到这一点。

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


我已经在这里回答了你的问题(http://stackoverflow.com/a/32264073/730701)。我发布的代码编译并且可以正常工作。你需要做的就是进行一个简单的类型转换。 - Adam
实际上不需要使用NSKeyedUnarchiver,因为包含IntStringArray类型的字典是属性列表兼容的。 - vadian
@Adam,我不确定你是否回答了我在这里提出的问题(当然,我可能是错误的)。我认为我会更进一步地尝试将addressDictaddressDict2合并,以便可以将addressDict2中的数据“放入”addressDict中,就像@Rajatp所说的那样。 - aejhyun
1个回答

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接