मैं इस समस्या के साथ 5 दिनों के लिए संघर्ष कर रहा हूं। कोई मजाक नहीं। कृपया सहायता कीजिए! यहां समस्या है जिसे मैं सामना कर रहा हूं।NSUserDefaults में एक शब्दकोश संग्रहीत करना और संग्रहीत डेटा का उपयोग करना।
मुझे क्या पता:
मैं एक वैश्विक चर के रूप में 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
का कारण बन जाएगा जिसे मैं पकड़ना चाहता हूं।
मैं क्या कोशिश की है:
आदेश की व्याख्या करने के लिए क्या मैं ऊपर का मतलब की कोशिश करने के लिए, यहाँ कुछ कोड है। नोट, यह कोड काम नहीं करता है, यह सिर्फ मेरे जैसा है, यह स्पष्ट करने के लिए, मेरा मतलब क्या है और यह दिखाने के लिए कि क्या निम्न कोड काम करेगा, यह मेरी समस्या का समाधान करेगा, मुझे लगता है (अगर मैं गलत हूं तो कृपया मुझे सही करें)।
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>>
}
}
}
तो अब, जब मैं इस कोड चलाएँ:: मेरे viewDidLoad()
में तो, मैं कुछ तरह निम्नलिखित होंगे
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
का उपयोग करने में सक्षम हो जाऊंगा! और जीवन सब अच्छा होगा। लेकिन मुझे नहीं पता कि यह कैसे करना है।
पीएस मैं सवाल की लंबाई के लिए गंभीरता से माफी माँगता हूं। अपना समय देने के लिए धन्यवाद!
मैं पहले से ही अपने प्रश्न [यहां] (जवाब दे दिया है http://stackoverflow.com/a/32264073/730,701)। कोड जो मैंने संकलित किया है और ठीक काम करता है। आपको यहां एक साधारण टाइपकास्ट की आवश्यकता है। – Adam
असल में 'NSKeyedUnarchiver' का उपयोग करने की आवश्यकता नहीं है क्योंकि 'int',' स्ट्रिंग' और' ऐरे 'प्रकार वाले शब्दकोश में संपत्ति सूची अनुपालन है। – vadian
@ एडम, मुझे यकीन नहीं है कि आपने यहां दिए गए प्रश्न का उत्तर दिया है (बेशक, मैं बहुत गलत हो सकता हूं)। मुझे लगता है कि मैं इसे कोशिश करके एक कदम आगे लेता हूं, जैसा कि @राजत ने इसे रखा है, 'पता डिक्ट' और 'पता डिक्ट 2' को मर्ज करें ताकि 'पताDict2'' में डेटा को 'पता' में रखा जा सके। – aejhyun