我已经为这个问题努力了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. 对于问题的长度,我深表歉意。谢谢你的时间!
NSKeyedUnarchiver
,因为包含Int
、String
和Array
类型的字典是属性列表兼容的。 - vadianaddressDict
和addressDict2
合并,以便可以将addressDict2
中的数据“放入”addressDict
中,就像@Rajatp所说的那样。 - aejhyun