【问题标题】:Array has error after being retrieved from NSUserDefaults从 NSUserDefaults 检索后数组有错误
【发布时间】:2015-01-27 19:21:26
【问题描述】:

我有一个自定义类,我已经为其实现了 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 似乎暗示发生了错误。但是,这是一个我不明白的错误。

【问题讨论】:

    标签: arrays cocoa-touch swift nsuserdefaults foundation


    【解决方案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]
        }
    }
    

    【讨论】:

      【解决方案2】:

      您没有向 NSUserDefaults 添加一个数组,而是一个普通对象。所以这意味着你不能用 arrayForKey 方法得到它。你必须得到它:

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

      【讨论】:

      • 我没有看到任何 setArrayForKey 方法。为什么有人会使用 arrayForKey?
      • 我不知道。但我会尝试使用 objectForKey。
      • 似乎没有改变结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多