2015-10-13 43 views
1

我有以下课程。当我尝试将其添加到NSUserDefaults的是这样的:如何将NSCoding应用到类中?

let testClass = TestClass() 
testClass.Property1 = 22.3 
NSUserDefaults.standardUserDefaults().setObject(testClass, forKey: "object1") 

我得到一个错误:

'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object for key object1'

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") 
     } 
    } 
} 

任何想法,我做错了吗?

回答

2

Any idea what I'm doing wrong?

是的。不是说明显而易见,而是“尝试插入非属性列表对象”几乎涵盖了它。您可以插入到默认系统中的对象种类仅限于属性列表类型:NSString,NSDate,NSNumber,NSData和集合NSArrayNSDictionary。你显然试图插入一些其他类型的对象,从而出现错误。

如果您想存储其他类型的对象,则需要以某种方式将其转换为受支持的类型之一。你在正确的轨道上 - 通常的做法是使用NSKeyedArchiver序列化对象,该对象可以存储采用NSCoding协议的对象。这个想法是,你创建一个密钥存档器,用它来序列化有问题的对象,然后获取一个NSData的实例,然后你可以存储该实例。要获取对象,请做相反的操作:使用NSKeyedUnarchiver将数据对象反序列化回原始对象。

它看起来像你期待NSUserDefaults序列化NSCoding符合你的对象,但这并没有发生 - 你需要自己做。

有很多例子,但寻找这个的通常地方是归档和序列化编程指南。具体而言,请查看"Creating and Extracting Archives"部分的示例代码。这里是一块相关的例子的序列化:

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

请记住,为了将对象序列这种方式,对象必须是采用NSCoding协议的类的实例。同样的文件解释了如何实施必要的方法,并且在这里也必须有几十个关于它的问题。