簡體   English   中英

無法使用 NSKeyedArchiver 來保存我的 model

[英]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.

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