2014-12-03 4 views
0

Здесь я хочу архивировать и разблокировать свой собственный класс, вот фрагмент кода.Как кодировать и декодировать этот класс

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 
    } 
} 

Мне интересно, как реализовать эти два метода.

+0

Вы можете преобразовать это в 'NSDictionary' и сохранить в файле json/plist. Или используйте 'NSArchiver', если вы ищете что-то более компактное (т.е. байты вместо xml/json). –

+1

Идея состоит в том, чтобы кодировать/декодировать переменные экземпляра, чтобы вы могли восстановить их из кодера. Сделайте это, как вам нравится. Размышление о способе представления массива типов (ужасный выбор имени, кстати) в качестве архивируемого объекта полностью зависит от вас. Просто помните, что то, что происходит, должно выйти; вам нужно представление, которое точно обратимо. – matt

+0

Спасибо, matt.I выдумали решение, основанное на вашем предложении. – tounaobun

ответ

1

Как о чем-то вроде этого ?:

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") 
     } 
    } 
} 

Комментарии:

  1. Я хотел захватить тот факт, что списки могут быть равны нулю. Это сохраняется в булевом массиве с именем «nils».
  2. Функция карты используется для преобразования массивов перечислений в [Int], которые содержат необработанные значения.
+0

Это уже протестировано и работает. – vacawama

+0

Thanks.vacawama. – tounaobun