我一直在爲這個問題奮鬥了5天。不是開玩笑。請幫忙!這是我遇到的問題。在NSUserDefaults中存儲字典並使用存儲的數據。
我所知道的:
我宣佈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
不再被不包含數據的變量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',因爲包含'Int','String'和'Array'類型的字典是屬性列表兼容的。 – vadian
@亞當,我不確定你是否回答了我在這裏提出的問題(當然,我可能是不正確的)。我想我更進一步,試着像@Rajatp一樣,把'addressDict'和'addressDict2'合併,以便'addressDict2'中的數據可以被放入addressDict'中。 – aejhyun