开发者社区> 问答> 正文

无法使用 NSKeyedArchiver 存档自定义类对象

我试图对我的自定义类执行一个简单的存档操作。我遵循了 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,但我只找到结构的解决方案,而我使用的是类。我能做什么?

展开
收起
上好佳Hao 2019-11-28 18:05:15 1470 0
1 条回答
写回答
取消 提交回答
  • 该方法应用于符合 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:

    2019-11-28 18:06:24
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载