我试图在数组中保存一些对象但我的对象使用继承属性 但是当试图阅读它所说的对象时
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -decodeObjectForKey: cannot be sent to an abstract object of class NSCoder: Create a concrete instance!'
结构是
Service(SuperClass)
Service1(Subclass)
Service2
Service3
这样我就可以使用这段代码了
var S1:Service1 = Service1()
S1.apiKey = Apikey.text!
TableViewController.agregar(S1)
let datos = NSKeyedArchiver.archivedDataWithRootObject(TableViewController.Servicios!)
NSUserDefaults.standardUserDefaults().setObject(datos, forKey: "ServiciosGuardados")
NSUserDefaults.standardUserDefaults().synchronize()
这是类函数
class Servicio:NSObject, NSCoding{
var nombre:String = "null"
var tipo:Int = 0
override init() {}
required init(coder aDecoder: NSCoder = NSCoder.empty()) {
self.nombre = aDecoder.decodeObjectForKey("nombre") as! String
self.tipo = aDecoder.decodeObjectForKey("tipo") as! Int
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(nombre, forKey: "nombre")
aCoder.encodeObject(tipo, forKey: "tipo")
}
- 我的问题出现在Service1中,它继承自Servicio
class Service1: Servicio {
var apiKey = "null"
override init() {
super.init(coder: NSCoder())
}
required init(coder aDecoder: NSCoder) {
super.init(coder: NSCoder())
if let apiKey = aDecoder.decodeObjectForKey("apiKey") as? String {
self.apiKey = apiKey
}
}
override func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.apiKey, forKey: "apiKey")
}
答案 0 :(得分:2)
您无法使用NSUserDefaults
保存非NSData
,NSString
,NSNumber
,NSDate
,NSArray
类型的对象或NSDictionary
。
但是,由于NSCoding
,您可以将自定义对象序列化并保存/加载到文件中。
由于您的班级已经支持NSCoding
,请使用NSKeyedArchiver
和NSKeyedUnarchiver
来存储和检索自定义对象:
// save your custom object in a file
NSKeyedArchiver.archiveRootObject(myCustomObject, toFile: "/path/to/filename")
// load your custom object from the file
if let temp = NSKeyedUnarchiver.unarchiveObjectWithFile("/path/to/filename") {
self.myCustomObject = temp
}
在此示例中,myCustomObject
可以是Service1
实例,也可以是实例数组等。
答案 1 :(得分:0)
这是:
NSUserDefaults
NSUserDefaults
类的行为非常类似于属性列表(又名plist)。对于一个plist来说它可能只是一个奇特的界面,或者它可能更多,我不完全确定。尽管如此,plist仍然限制他们可以存储什么样的对象。六种类型的plists可以存储:
NSData
NSString
NSNumber
NSDate
NSArray
NSDictionary
以下是存储自定义对象的示例:How to store custom objects in NSUserDefaults