2
struct AllItemsData {
    var DSTBID: String!
    var CCAS: String!
    var BCAS: String!
}

This is my structure from which I create an array of type AllItemsDataArray = [AllItemsData()]

After adding some data, now I want to store it into user defaults.

I did it this way:

AllItemsDataArray.removeFirst()

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

But the error is like:

ios[1540:537869] -[_SwiftValue encodeWithCoder:]: unrecognized selector sent to instance 0x15d1e200

The values in the array just before the crash happens is:

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

rmaddy
  • 314,917
  • 42
  • 532
  • 579

1 Answers1

2

You need to implement NSCoding protocol for you object, and use class instead of 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")
    }
}
Grzegorz Krukowski
  • 18,081
  • 5
  • 50
  • 71