Ios 无法使用NSKeyedArchiver存档自定义类对象
我正在尝试对我的自定义类Ios 无法使用NSKeyedArchiver存档自定义类对象,ios,swift,nskeyedarchiver,Ios,Swift,Nskeyedarchiver,我正在尝试对我的自定义类Car执行一个简单的归档操作。我遵循苹果的文档,并使其符合Codable协议: class Car: NSObject, Codable { var name: String! init(name:String) { self.name = name } } 我想将其归档为: let car = Car(name: "Ferrari") let data = NSKeyedArchiver.archivedData(withRo
Car
执行一个简单的归档操作。我遵循苹果的文档,并使其符合Codable
协议:
class Car: NSObject, Codable {
var name: String!
init(name:String) {
self.name = name
}
}
我想将其归档为:
let car = Car(name: "Ferrari")
let data = NSKeyedArchiver.archivedData(withRootObject: car)
但在第二行,应用程序崩溃,我得到以下错误:
***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\u TtCC11Testing6MainVC3Car EncoderWithCoder:]:发送到实例0x1c4035880的无法识别的选择器'libc++abi.dylib:由于NSException类型的未捕获异常而终止
我已经搜索了这么多,但我只找到了结构的解决方案,而我使用的是一个类。我能做什么?应在符合
NSCoding
非可编码/可编码/可解码的对象上使用NSKeyedArchiver.archivedData(withRootObject:)
方法
如果您希望您的对象实现Codable
协议,您可以使用jsonecoder
和jsondecorder
实现相同的功能,如下所示:
let car=car(名称:“法拉利”)
如果让encodedCarData:Data=try?JSONEncoder().encode(汽车){
让decodedCar=try?JSONDecoder().decode(Car.self,from:encodedCarData)
}
如果您希望改用NSKeyedArchiver
,可以使用以下示例:
class汽车:NSObject,NSSecureCoding{
静态变量SupportsSecureCodeding:Bool{return true}
变量名称:String
init(名称:String){
self.name=名称
}
必需的初始化?(编码器aDecoder:NSCoder){
guard let name=aDecoder.decodeObject(forKey:“name”)as?String else{return nil}
self.name=名称
}
func编码(带aCoder:NSCoder){
aCoder.encode(名称,forKey:“名称”)
}
}
let car=汽车(名称:“法拉利”)
如果让encodedCarData=
尝试NSKeyedArchiver.archivedData(带根对象:汽车、,
RequiringSecureCodeding:false){
设decodedCar=
尝试NSKeyedUnarchiver.unarchivedObject(类:Car.self,
发件人:encodedCarData)
}
您还应该注意,archivedData(withRootObject:)
在iOS 12.0中被弃用,您应该使用+archivedDataWithRootObject:requirementsecurecoding:error:
。NSKeyedArchiver。archivedData(withRootObject:)
方法应用于符合NSCoding
非Codable
/Encodable
/Decodable
的对象。非常感谢,是否也可以以同样的方式将NSKeyedArchiver
与结构一起使用?@muhammedül不幸的是,NSKeyedArchiver
只能在扩展NSObject
的类上工作。然而,Codable
协议可以处理结构,是实现与NSKeyedArchiver
方法相同的功能的更新、更简洁、更有利的方法。