从NSUserDefaults检索后,Array出错

时间:2015-01-27 19:21:26

标签: arrays cocoa-touch swift nsuserdefaults foundation

我有一个自定义类,我已经实现了NSCoder协议。我想要的数据模型是在NSUserDefaults中存储这些自定义类的数组。我将其编码为NSData并将其存储在一个数组中,我存储在NSUserDefaults中。但是,当我从NSUserDefaults检索存储的数据时,该数组不包含我最初设置的值。这是一个例子,几行代码,其中一些明确用于调试:

let values = Subject(name: self.name.text, instructor: self.instructor.text, time: self.time.date, assignments:nil) //Create my custom class
let archivedValues = NSKeyedArchiver.archivedDataWithRootObject(values) //Archive as NSData
var testarr = [archivedValues] //Store as Array<NSData>
NSUserDefaults.standardUserDefaults().setObject(testarr, forKey: "subjects") //Commit to NSUserDefaults
var subjectArray = NSUserDefaults.standardUserDefaults().arrayForKey("subjects") as Array<NSData> //Retrieve array

然而,这两个数组的内容是不同的。印刷说明:

Printing description of testarr:
([NSData]) testarr = 1 value {
[0] = 0x00007f9998e89440 445 bytes
}
Printing description of subjectArray:
([NSData]) subjectArray = 1 value {
[0] = <error: use of undeclared identifier 'cocoarr'
error: 1 errors parsing expression
>

检索到的subjectArray似乎意味着发生了错误。但是,这是一个我不明白的错误。

2 个答案:

答案 0 :(得分:1)

您在保存数据方面的所有方法都不正常。而不是使它成为NSData数组,使其成为一个主题数组,然后将其归档为NSData。

let subject1 = Subject(name: self.name.text, instructor: self.instructor.text, time: self.time.date, assignments:nil) //Create my custom class
let array = [subject1]

let data = NSKeyedArchiver.archivedDataWithRootObject(array)
let defaults = NSUserDefaults.standardUserDefaults()

// Storing the data
defaults.setObject(data, forKey: "subjects")

// Retrieving the data
if let data = defaults.objectForKey("subjects") as? NSData {
    if let subjects = NSKeyedUnarchiver.unarchiveObjectWithData(data) as? [Subject] {
            // Now you have your subjects as [Subject]
    }
}

答案 1 :(得分:0)

您没有向NSUserDefaults添加数组,而是添加普通对象。这意味着您无法使用arrayForKey方法获取它。你必须得到它:

var subjectArray = NSUserDefaults.standardUserDefaults().objectForKey("subjects")