将自定义 class 保存到用户默认值内的数组中

Saving a custom class into array inside user defaults

假设我有一个名为 Lop 的 class。然后我想将它的实例保存到某个数组中的用户默认值,并从该数组中检索对象。

我已经在 class 中创建了 NSCoding 方法,现在正在尝试将函数写入 save/retrieve 并且遇到了困难:

添加例如:

   func addLop(newlop:ALop)
    {

        //get defaults array(already archived)
        let lops  = NSUserDefaults.standardUserDefaults().objectForKey("lops")

        //add a new lop class, archived, to the user defaults array
        let data = NSKeyedArchiver.archivedDataWithRootObject(newlop)
        lops?.addObject(data)
        NSUserDefaults.standardUserDefaults().setObject(lops, forKey: "lops")


    }

我真的不知道这是否有效,因为我无法处理的检索函数:

    func getLops()->Array<Any>
    {
        //get defaults array(archived)
        let lops  = NSUserDefaults.standardUserDefaults().objectForKey("lops")

        //here i should loop over this array of archived classes ,
 then turn all of them into original unarchived classes and return

    }

1.How 我可以写一个函数 returns 未归档的数组 classes 吗?

  1. 保存时(如果操作正确)如何在保存前检查 class 是否已存在于用户默认设置中?
  1. NSKeyedUnarchiver.unarchiveObjectWithData(lops[i] as! NSData)
  2. 首先,您可以将选中的对象存档到 NSData,然后检查 NSData 与您已经存储在的每个存档 NSData 的相等性(通过调用 data.isEqual(lops[i])NSUserDetaults

另一种方法是从 NSUserDefaults 中取消归档每个已存储的对象并检查 ALop 对象的相等性。您必须在 ALop class 中实现 bool isEqual(other : NSObject) 方法并在其中比较两个对象的所有属性,例如

bool isEqual(other : NSObject)
{
    let otherALop = other as? Alop
    if otherALop == nil {return false }
    if otherALop == self { return true }

    bool result = true
    result = result && (self.property == otherALop!.property)
    // ... for all properties repeat previous line 
    return result 
}

请注意 NSUserDefaults 仅限于存储不超过 ~64 KB,并且不打算存储您的模型层数据对象,仅存储应用程序的首选项。