Swift2 如何将NSCoding应用于类?

Swift2 如何将NSCoding应用于类?,swift2,nsuserdefaults,Swift2,Nsuserdefaults,我有以下课程。当我尝试将其添加到NSUserDefaults时,如下所示: let testClass = TestClass() testClass.Property1 = 22.3 NSUserDefaults.standardUserDefaults().setObject(testClass, forKey: "object1") 我得到一个错误: 'NSInvalidArgumentException',原因:'尝试插入非属性 键object1'的列表对象 知道我做错了什么吗 知道我

我有以下课程。当我尝试将其添加到NSUserDefaults时,如下所示:

let testClass = TestClass()
testClass.Property1 = 22.3
NSUserDefaults.standardUserDefaults().setObject(testClass, forKey: "object1")
我得到一个错误:

'NSInvalidArgumentException',原因:'尝试插入非属性 键object1'的列表对象

知道我做错了什么吗

知道我做错了什么吗

对。不是说显而易见,但“尝试插入非属性列表对象”几乎涵盖了这一点。可以插入默认系统的对象类型仅限于属性列表类型:
NSString
NSDate
NSNumber
NSData
、集合
NSArray
NSDictionary
。显然,您正在尝试插入其他类型的对象,因此出现了错误

如果您想存储其他类型的对象,您需要以某种方式将其转换为支持的类型之一。这是正确的——通常的方法是使用
NSKeyedArchiver
序列化对象,它可以存储采用
NSCoding
协议的对象。其思想是创建一个键控归档程序,使用它序列化有问题的对象,并获取
NSData
的实例,然后存储该实例。要恢复该对象,您可以执行相反的操作:使用
NSKeyedUnarchiver
将数据对象反序列化回原始对象

看起来您希望
NSUserDefaults
为您序列化
NSCoding
兼容的对象,但这并没有发生,您需要自己完成

有很多例子,但通常可以在归档和序列化编程指南中找到。具体来说,请查看示例代码部分。下面是一个序列化的相关示例:

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:aPerson forKey:ASCPersonKey];
[archiver finishEncoding];
请记住,为了以这种方式序列化对象,该对象必须是采用
NSCoding
协议的类的实例。同一个文档解释了如何实现必要的
NSCoding
方法,这里肯定还有几十个问题

NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:aPerson forKey:ASCPersonKey];
[archiver finishEncoding];