[英]Cannot archive custom class object with NSKeyedArchiver
我正在嘗試對我的自定義類Car
執行簡單的存檔操作。 我遵循 Apple 文檔並使其符合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)
但在第二行應用程序崩潰,我收到以下錯誤:
*** 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
我已經搜索過,但我只找到了結構的解決方案,而我正在使用一個類。 我能做什么?
NSKeyedArchiver.archivedData(withRootObject:)
方法應該用於符合NSCoding
NOT Codable/Encodable/Decodable
。
如果您希望您的對象實現Codable
協議,您可以使用如下所示的JSONEncoder
和JSONDecoder
來實現相同的目的:
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)
}
您還應該注意, archivedData(withRootObject:)
在 iOS 12.0 中已棄用,您應該使用+archivedDataWithRootObject:requiringSecureCoding:error:
代替。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.