如何将NSCoding应用于课程?

时间:2015-10-13 19:38:02

标签: swift2 nsuserdefaults

我有以下课程。当我尝试将它添加到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")
        }
    }
}

知道我做错了吗?

1 个答案:

答案 0 :(得分:2)

  

知道我做错了吗?

是。不要说明显而易见的,但是"尝试插入非属性列表对象"几乎涵盖了它。您可以插入默认系统的对象类型仅限于属性列表类型:NSStringNSDateNSNumberNSData和集合NSArrayNSDictionary。您显然试图插入其他类型的对象,因此错误。

如果您想存储其他类型的对象,您需要以某种方式将其转换为支持的类型之一。您处于正确的轨道上 - 通常的方法是使用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上也必须有几十个问题。