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
方法相同的功能的更新、更简洁、更有利的方法。