tounaobun
tounaobun

Reputation: 14857

How to encode and decode this class

Here I want to archive and unarchive my custom class,here is the code snippet.

enum Type: Int {
case Fruit
case Meat
case Drink
}

class ShoppingList {

    var typeOne: [Type]!

    var typeTwo: [Type]!

    var typeThree: [Type]!

    init(coder aDecoder: NSCoder) {

        // how to decode enum-based array
    }

    func encodeWithCoder(aCoder: NSCoder) {

        // how to encode enum-based array
    }
}

I am wondering how to implement these two methods.

Upvotes: 0

Views: 2082

Answers (1)

vacawama
vacawama

Reputation: 154603

How about something like this?:

class ShoppingList: NSObject, NSCoding {

    var typeOne: [Type]!

    var typeTwo: [Type]!

    var typeThree: [Type]!

    override init() {
        super.init()
    }

    required init(coder aDecoder: NSCoder) {
        let nils = aDecoder.decodeObjectForKey("nils") as [Bool]
        if nils[0] {
            typeOne = nil
        } else {
            let typeOneInt = aDecoder.decodeObjectForKey("typeOneInt") as [Int]
            self.typeOne = typeOneInt.map{Type(rawValue: $0) ?? .Fruit}
        }
        if nils[1] {
            typeTwo = nil
        } else {
            let typeTwoInt = aDecoder.decodeObjectForKey("typeTwoInt") as [Int]
            self.typeTwo = typeTwoInt.map{Type(rawValue: $0) ?? .Fruit}
        }
        if nils[2] {
            typeThree = nil
        } else {
            let typeThreeInt = aDecoder.decodeObjectForKey("typeThreeInt") as [Int]
            self.typeThree = typeThreeInt.map{Type(rawValue: $0) ?? .Fruit}
        }
    }

    func encodeWithCoder(aCoder: NSCoder) {
        let nils:[Bool] = [typeOne == nil, typeTwo == nil, typeThree == nil]
        aCoder.encodeObject(nils, forKey:"nils")

        if typeOne != nil {
            let typeOneInt:[Int] = typeOne.map{$0.rawValue}
            aCoder.encodeObject(typeOneInt, forKey:"typeOneInt")
        }
        if typeTwo != nil {
            let typeTwoInt:[Int] = typeTwo.map{$0.rawValue}
            aCoder.encodeObject(typeTwoInt, forKey:"typeTwoInt")
        }
        if typeThree != nil {
            let typeThreeInt:[Int] = typeThree.map{$0.rawValue}
            aCoder.encodeObject(typeThreeInt, forKey:"typeThreeInt")
        }
    }
}

Comments:

  1. I wanted to capture the fact the lists could be nil. This is stored in a boolean array called "nils".
  2. The map function is used to convert the arrays of enums to [Int] which hold raw values.

Upvotes: 1

Related Questions