簡體   English   中英

無法使用 NSKeyedArchiver 歸檔自定義類對象

[英]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協議,您可以使用如下所示的JSONEncoderJSONDecoder來實現相同的目的:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM