将自定义类保存到用户默认值

时间:2016-03-15 18:13:28

标签: ios swift nscoding

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

我在该类中创建了NSCoding方法,现在尝试编写保存/检索的函数并且很难:

添加例如:

   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.如何编写一个返回未归档类数组的函数?

  1. 保存时(如果操作正确)如何在保存之前检查用户默认值中是否已存在类?

1 个答案:

答案 0 :(得分:0)

  1. 使用NSKeyedUnarchiver.unarchiveObjectWithData(lops[i] as! NSData)
  2. 首先,您可以将已检查的对象存档到NSData,然后检查data.isEqual(lops[i])与您已存储在{{NSData中的每个已归档NSData的相等性(通过调用NSUserDetaults) 1}}。
  3. 其他方法是从NSUserDefaults取消归档每个已存储的对象并检查ALop对象的相等性。您必须在bool isEqual(other : NSObject)类中实现ALop方法,并在其中比较两个对象的所有属性,例如

    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,并且不用于存储模型层数据对象,只能存储应用程序的首选项。