[英]Cannot use NSKeyedArchiver to save my model
我從 Api 得到 model ,它看起來像這樣:
class Device : NSObject, Codable, NSCoding{
var deviceId : Int?
var driver : String?
var address : String?
var type : DeviceTypes? // Enum type
func encode(with coder: NSCoder) {
coder.encode(self.deviceId, forKey: "deviceId")
coder.encode(self.driver, forKey: "driver")
coder.encode(self.address, forKey: "address")
coder.encode(self.type, forKey: CodingKeys.type.rawValue)
}
required init?(coder: NSCoder) {
super.init()
self.deviceId = coder.decodeInteger(forKey: "deviceId")
self.driver = coder.decodeObject(forKey: "driver") as? String
self.address = coder.decodeObject(forKey: "address") as? String
self.type = coder.decodeObject(forKey: CodingKeys.type.rawValue) as? DeviceTypes
}
private enum CodingKeys : String, CodingKey{
case deviceId, address, type, deviceType
}
}
然后我將一些元素添加到數組中,它可以工作,但是當我嘗試使用 NSKeyedArchiver 對其進行歸檔時,它會引發異常:
[__SwiftValue encodeWithCoder:]:發送到實例的無法識別的選擇器
設備類型
enum DeviceTypes : Int, Codable{
case SYSTEM
case CE
case CZ
case ST
case KA
case CR
case EX
case DR
case KL
case WE
case WY
case WL
case TR
case LI
case BR = 30
case DC = 32
}
您的問題是NSCoding
僅適用於 class 類型。 任何使DeviceTypes
符合NSCoding
的嘗試都會導致錯誤
enum DeviceTypes : Int, Codable, NSCoding {
非類類型 'DeviceTypes' 不能符合 class 協議 'NSCoding'
一種解決方案是在NSCoding
方法中從enum
類型來回轉換。
請注意, NSSecureCoding
不推薦使用NSCoding
,因此您應該使用該一致性以避免將來出現支持問題。
class Device : NSObject, NSSecureCoding {
static var supportsSecureCoding: Bool = true
var deviceId : Int?
var driver : String?
var address : String?
var type : DeviceTypes? // Enum type
func encode(with coder: NSCoder) {
coder.encode(self.deviceId, forKey: "deviceId")
coder.encode(self.driver, forKey: "driver")
coder.encode(self.address, forKey: "address")
coder.encode(self.type?.rawValue, forKey: "type")
}
required init?(coder: NSCoder) {
super.init()
self.deviceId = coder.decodeInteger(forKey: "deviceId")
self.driver = coder.decodeObject(forKey: "driver") as? String
self.address = coder.decodeObject(forKey: "address") as? String
let rawtype = coder.decodeInteger(forKey: "type")
self.type = DeviceTypes(rawValue: rawtype)
}
}
您還沒有在您的Device
class 中提供所有代碼,因為您的帖子片段沒有按照Codable
一致性編譯,所以我無法猜測您的系統在 JSON 支持方面真正需要什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.