gpt4 book ai didi

ios - 无法使用 NSKeyedArchiver 保存我的模型

转载 作者:行者123 更新时间:2023-12-01 21:48:24 30 4
gpt4 key购买 nike

我从 Api 获取模型,它看起来像这样:

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 对其进行存档时,它会引发 Exception :

[__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仅适用于类类型。任何符合 DeviceTypes 的尝试至NSCoding将导致错误

enum DeviceTypes : Int, Codable, NSCoding {

Non-class type 'DeviceTypes' cannot conform to class protocol 'NSCoding'



一种解决方案是从 enum 来回转换。输入您的 NSCoding方法。

请注意 NSCoding不推荐使用 NSSecureCoding因此,您应该使用该一致性来避免 future 的支持问题。
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 中的所有代码类,因为您的帖子片段无法使用 Codable 进行编译一致性,所以我无法猜测您的系统在 JSON 支持方面真正需要什么。

关于ios - 无法使用 NSKeyedArchiver 保存我的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61886300/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com