我试图对我的自定义类执行一个简单的存档操作。我遵循了 Apple 文档,使其符合协议: CarCodable class Car: NSObject, Codable { var name: String!
init(name:String) {
self.name = name
}
} 我想把它存档,就像: let car = Car(name: "Ferrari") let data = NSKeyedArchiver.archivedData(withRootObject: car) 但在第二行,应用程序崩溃,我得到以下错误: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_TtCC11Testing6MainVC3Car encodeWithCoder:]: unrecognized selector sent to instance 0x1c4035880' libc++abi.dylib: terminating with uncaught exception of type NSException 我搜索过 SO,但我只找到结构的解决方案,而我使用的是类。我能做什么?
该方法应用于符合 NOT 的对象。NSKeyedArchiver.archivedData(withRootObject:)NSCodingCodable/Encodable/Decodable 如果希望对象实现协议,可以使用 和 类似实现相同的操作:CodableJSONEncoderJSONDecoder let car = Car(name: "Ferrari") if let encodedCarData: Data = try? JSONEncoder().encode(car) { let decodedCar = try? JSONDecoder().decode(Car.self, from: encodedCarData) }
如果您希望改用 ,可以使用以下示例:
NSKeyedArchiver class Car: NSObject, NSSecureCoding {
static var supportsSecureCoding: Bool { return true }
var name: String
init(name: String) {
self.name = name
}
required init?(coder aDecoder: NSCoder) {
guard let name = aDecoder.decodeObject(forKey: "name") as? String else { return nil }
self.name = name
}
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
}
}
let car = Car(name: "Ferrari") if let encodedCarData = try? NSKeyedArchiver.archivedData(withRootObject: car, requiringSecureCoding: false) { let decodedCar = try NSKeyedUnarchiver.unarchivedObject(ofClass: Car.self, from: encodedCarData) } 您还应注意,在 iOS 12.0 中已弃用,您应该改用。archivedData(withRootObject:)+archivedDataWithRootObject:requiringSecureCoding:error:
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。