gpt4 book ai didi

ios - 在 Swift 的 NSUserDefaults 中保存自定义类对象

转载 作者:行者123 更新时间:2023-11-28 13:11:46 27 4
gpt4 key购买 nike

我试图将一些对象保存在数组中,但我的对象使用了继承的属性但是当试图读取它说的对象时

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

-我的问题出在继承自 Servicio 的 Service1 中

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

最佳答案

您不能使用 NSUserDefaults 来保存类型不是 NSDataNSStringNSNumber 的对象、NSDateNSArrayNSDictionary

但由于 NSCoding,您可以在文件中序列化和保存/加载您的自定义对象。

因为你的类已经支持NSCoding,使用NSKeyedArchiverNSKeyedUnarchiver 来存储和检索你的自定义对象:

// 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实例,或者一个实例数组等。

关于ios - 在 Swift 的 NSUserDefaults 中保存自定义类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31018310/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com