Bu problemle 5 gün boyunca mücadele ediyorum. Şaka değil. Lütfen yardım et! İşte karşılaştığım problem.NSUserDefaults'da bir sözlük depolamak ve saklanan verileri kullanmak.
biliyorum Ne:
Ben global bir değişken olarak var addressDict = Dictionary<Int, Array<String>>()
ilan etti. Şimdi, adres kodumda saklanan verileri eklemek ve veriyi NSUserDefaults içine kaydedilebilecek şekilde değiştirmek için aşağıdaki kodun kullanıldığını anlıyorum.
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)
}
Şimdi, uygulamanın çalışma her zaman, addressDict2
depolanan verileri tarafından geçersiz olur benim addressDict
uygulama başladığında, addressDict
hiçbir veri yokken çünkü. Bu yüzden, addressDict2
'a bazı verileri eklemiş olmama rağmen, hiçbir veriye sahip olmayan addressDict
'un üzerine yazılıyor.
yüzden self.defaults.setObject(data, forKey: "addressDict")
, yukarıda ancak hat olmadan kod çalıştırabilir ve şimdi, addressDict2
artık addressDict
, hiçbir verileri tutan bir değişken tarafından üzerlerine bu sorunu çözmek için. Bu yüzden eklediğim veriler addressDict2
'da saklanır. Ancak, bunu yaparsam, addressDict2
'a artık yeni bilgiler ekleyemiyorum çünkü artık self.defaults.setObject(data, forKey: "addressDict")
yok. Ben bilmek istedikleriniz
... burada ikilemimi bkz umut:
Bu benim kod yapmak istiyorum şeydir. addressDict2
gibi bazı değişkenlere yeni bilgiler ekleyebilmek istiyorum. Uygulama başladığında, addressDict2
'daki verilerin addressDict
'a kopyalanmasını istiyorum. Yani bu, tutmasını istediğim verileri tutmak için addressDict
neden olur.
denedim Ne: Yukarıda ne anlama geldiğini anlatmaya çalışacağım için
, burada bazı kodudur. Not, bu kod çalışmaz, sadece ne demek istediğimi açıklamak ve aşağıdaki kodun işe yarayıp yaramayacağını göstermek, sorunumu çözecektir, sanırım (lütfen yanılıyorsam düzeltin).
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)
}
burada addressDict
artık boş olacaktır ve üzerine yazmaz: Bu kodu çalıştırdığınızda, Şimdi
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>>
}
}
}
: benim viewDidLoad()
Yani, şu gibi şey olurdu Boş verilerle addressDict2
. Ve tüm kalıcı olarak saklanan verilerle addressDict
'u kullanabileceğim! Ve hayat iyi olacak. Ama bunun nasıl yapılacağını bilmiyorum.
P.S. Sorunun uzunluğu için cidden özür dilerim. Zaman ayırdığın için teşekkürler!
http://stackoverflow.com/a/32264073/730.701). Gönderdiğim kod derler ve iyi çalışır. İhtiyacın olan şey basit bir yazımdır. – Adam
Aslında 'NSKeyedUnarchiver' kullanmak için gerekli değildir, çünkü' Int', 'String' ve' Array' türlerini içeren bir sözlük özellik listesiyle uyumludur. – vadian
@Adam, Burada belirttiğim soruya cevap verdiğinizden emin değilim (elbette, çok yanlış olabilirim). Sanırım, @Rajatp olarak yazarak, onu bir adres daha 'addressDict' ve 'addressDict2' ile birleştirerek bir adım daha ileri götürüyorum. Böylece, addressDict2'deki veriler "addressDict" içine yerleştirilebilir. – aejhyun