arrays - 从 NSUserDefaults 检索数组后出现错误

标签 arrays cocoa-touch swift nsuserdefaults foundation

我有一个自定义类,我已为其实现了 NSCoder 协议(protocol)。我的预期数据模型是将这些自定义类的数组存储在 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 似乎暗示发生了错误。但是,这是一个我不明白的错误。

最佳答案

你保存数据的方式完全不正确。不要将其设置为 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]
    }
}

关于arrays - 从 NSUserDefaults 检索数组后出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28178346/

相关文章:

C++:如何分配和填充通过引用传递的结构的动态数组?

javascript - Javascript可以动态创建多维数组吗

cocoa-touch - 为什么Cocoa里没有队列?

ios - 从 JSON 加载信息

swift - 如何使用 Swift Playground 中的更新功能

c - 在 C 中保存随机生成的数字

javascript - 转换带有对象的数组以进行操作

ios - 正确使用 NSFileHandle

ios - 如何获得与 iPhone 上的联系人应用程序相同的部分索引标题

ios - 当我使用自定义 UIColors 时标签的文本颜色没有改变