【问题标题】:How to apply NSCoding to a class?如何将 NSCoding 应用于课程?
【发布时间】:2015-10-13 19:38:02
【问题描述】:

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

知道我做错了什么吗?

【问题讨论】:

    标签: swift2 nsuserdefaults


    【解决方案1】:

    知道我做错了什么吗?

    是的。不是说显而易见的,而是“尝试插入非属性列表对象”几乎涵盖了它。您可以插入默认系统的对象类型仅限于属性列表类型:NSStringNSDateNSNumberNSData 和集合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 协议的类的实例。同一份文档解释了如何实现必要的NSCoding 方法,在 SO 上也肯定有很多关于它的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2011-05-09
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      相关资源
      最近更新 更多