将自定义 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 吗?
- 保存时(如果操作正确)如何在保存前检查 class 是否已存在于用户默认设置中?
- 和
NSKeyedUnarchiver.unarchiveObjectWithData(lops[i] as! NSData)
- 首先,您可以将选中的对象存档到
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,并且不打算存储您的模型层数据对象,仅存储应用程序的首选项。
假设我有一个名为 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 吗?
- 保存时(如果操作正确)如何在保存前检查 class 是否已存在于用户默认设置中?
- 和
NSKeyedUnarchiver.unarchiveObjectWithData(lops[i] as! NSData)
- 首先,您可以将选中的对象存档到
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,并且不打算存储您的模型层数据对象,仅存储应用程序的首选项。