2015-09-02 99 views
5

我一直在爲這個問題奮鬥了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.我對問題的長度深表歉意。感謝您的時間!

+0

我已經回答了你的問題[這裏](http://stackoverflow.com/a/32264073/730701)。我發佈的代碼編譯和工作正常。你需要的是一個簡單的類型轉換。 – Adam

+0

事實上,它不需要使用'NSKeyedUnarchiver',因爲包含'Int','String'和'Array'類型的字典是屬性列表兼容的。 – vadian

+0

@亞當,我不確定你是否回答了我在這裏提出的問題(當然,我可能是不正確的)。我想我更進一步,試着像@Rajatp一樣,把'addressDict'和'addressDict2'合併,以便'addressDict2'中的數據可以被放入addressDict'中。 – aejhyun

回答

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 
}