我有以下课程。当我尝试将它添加到NSUserDefaults时:
let testClass = TestClass()
testClass.Property1 = 22.3
NSUserDefaults.standardUserDefaults().setObject(testClass, forKey: "object1")
我收到错误:
'NSInvalidArgumentException',原因:'尝试插入非属性 关键对象1的列表对象
class TestClass: NSObject, NSCoding {
var Property1:Double?
override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
if let priceCoded = aDecoder.decodeObjectForKey("Property1") as? Double {
self.Property1 = priceCoded
}
}
func encodeWithCoder(aCoder: NSCoder){
if let priceEncoded = self.Property1 {
aCoder.encodeObject(priceEncoded, forKey: "Property1")
}
}
}
知道我做错了吗?
答案 0 :(得分:2)
知道我做错了吗?
是。不要说明显而易见的,但是"尝试插入非属性列表对象"几乎涵盖了它。您可以插入默认系统的对象类型仅限于属性列表类型: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];
个符合标准的对象,但这不会发生 - 您需要自己完成。
周围有很多例子,但通常的地方是档案和序列化编程指南。具体来说,请查看"Creating and Extracting Archives"部分以获取示例代码。这是序列化相关示例的一部分:
NSCoding
请记住,为了以这种方式序列化对象,该对象必须是采用NSCoding
协议的类的实例。同一文档解释了如何实现必要的document.getElementById('1').style.display="none";
方法,并且在SO上也必须有几十个问题。