2017-01-31 3 views
2
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:]: unrecognized selector sent to instance 0x15d1e200

Значения в массиве непосредственно перед случается авария это:

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

+1

Ваша структура не соответствует протоколу 'NSCoding'. – rmaddy

+0

да :(Жаль, что структура никогда не соответствует NSCoding - я также ищу подходящее решение для этого - как сохранить и восстановить структуру (и вложенную структуру) от и до UserDefaults – muescha

+0

на struct вы получите ошибку : non-class type «AllItemsData» не может соответствовать протоколу класса «NSCoding», поэтому у вас никогда не будет возможности реализовать «NSCoding» :( – muescha

ответ

2

Вы необходимо реализовать протокол 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") 
    } 
} 
+0

вы забыли сказать, что ему нужно изменить его на класс. mot больше по значению - теперь по ссылке. – muescha

+0

У вас неправильная подпись, если это должно быть Swift 3. – rmaddy

+0

Да, для swift3 он должен быть «закодирован (с кодировщиком: NSCoder)» –