【问题标题】:Save Custom Dictionary to User default将自定义词典保存到用户默认值
【发布时间】:2023-04-04 22:33:01
【问题描述】:
struct AllItemsData {
    var DSTBID: String!
    var CCAS: String!
    var BCAS: String!
}

这是我创建类型数组的结构 AllItemsDataArray = [AllItemsData()]

添加一些数据后,现在我想将其存储到用户默认值中。

我是这样做的:

AllItemsDataArray.removeFirst()

let archivedArray = NSKeyedArchiver.archivedData(withRootObject: All_ItemsDataArray)
            print(archivedArray)
            preference.set(archivedArray, forKey: allItemsDataKey)

但错误是这样的:

ios[1540:537869] -[_SwiftValue encodeWithCoder:]:无法识别的选择器发送到实例 0x15d1e200

崩溃发生前数组中的值是:

AllItemsData(DSTBID:GGGGGGGGGGGG,CCAS:,BCAS:)
AllItemsData(DSTBID:HHHHHHHHHHHH,CCAS:,BCAS:)

【问题讨论】:

  • 您的结构不符合NSCoding 协议。
  • 是的 :( 很遗憾结构从不符合 NSCoding - 我也在寻找一个很好的解决方案 - 如何在 UserDefaults 之间保存和恢复结构(和嵌套结构)
  • 在结构上你会得到一个error: non-class type 'AllItemsData' cannot conform to class protocol 'NSCoding',所以你永远没有机会实现NSCoding :(
  • 你需要换一个类
  • 但我正在等待更好的解决方案

标签: ios swift nskeyedarchiver


【解决方案1】:

您需要为您的对象实现 NSCoding 协议,并使用 class 而不是 struct

class AllItemsData: NSObject, NSCoding {
    var DSTBID: String!
    var CCAS: String!
    var BCAS: String!

    required convenience init?(coder decoder: NSCoder) {
        let DSTBID = decoder.decodeObjectForKey("DSTBID") as? String,
        let CCAS = decoder.decodeObjectForKey("CCAS") as? String,
        let BCAS = decoder.decodeObjectForKey("BCAS") as? [String]

        self.init(
            DSTBID: DSTBID,
            CCAS: CCAS,
            BCAS: BCAS
        )
    }

    func encodeWithCoder(coder: NSCoder) {
        coder.encodeObject(self.DSTBID, forKey: "DSTBID")
        coder.encodeObject(self.CCAS, forKey: "CCAS")
        coder.encodeInt(Int32(self.BCAS), forKey: "BCAS")
    }
}

【讨论】:

  • 你忘了说他需要把它改成一个类。 mot 不再是价值 - 现在是参考。
  • 如果这应该是 Swift 3,那么你的签名是错误的。
  • 是的 swift3 应该是“encode(with coder: NSCoder)”
猜你喜欢
  • 2016-02-05
  • 2018-01-09
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多