¿Cómo usar NSUserDefaults para almacenar una matriz de classs personalizadas en Swift?

Tengo una class personalizada llamada Person que almacena varios attributes sobre alguien cuando ingresa información.

 class Person { // Person dictionary variable var name: String? var age: String? var html_url: String? init(json: NSDictionary) { // Dictionary object self.name = json["name"] as? String self.age = json["age"] as? String self.html_url = json["html_url"] as? String // Location of the JSON file } } 

Una vez que se crea el dictionary, se coloca en una matriz. Tengo problemas para save la matriz en NSUserDefaults cuando se NSUserDefaults un button.

 personArray.append(newPerson) // newPerson = dictionary of attributes NSUserDefaults.standardUserDefaults().setObject(personArray, forKey: "personArray") NSUserDefaults.standardUserDefaults().synchronize() 

He visto cómo almacenar objects personalizados en NSUserDefaults y save la class SWIFT personalizada con NSCoding a UserDefaults, pero no he tenido suerte y me resulta difícil de entender.

Cuando bash save en NSUserDefaults, me dicen lo siguiente:

 Attempt to set a non-property-list object ( "PersonApp.Person" ) as an NSUserDefaults/CFPreferences value for key personArray 

¿Alguien podría ayudarme a save una variedad de objects personalizados (dictionarys personalizados) a través de NSUserDefaults?

La class de tu persona debería verse así:

 class Person : NSObject, NSCoding{ // Person dictionary variable var name: String? var age: String? var html_url: String? init(json: NSDictionary) { // Dictionary object self.name = json["name"] as? String self.age = json["age"] as? String self.html_url = json["html_url"] as? String // Location of the JSON file } requinetworking init?(coder aDecoder: NSCoder) { self.name = aDecoder.decodeObjectForKey("name") as? String; self.age = aDecoder.decodeObjectForKey("age") as? String; self.html_url = aDecoder.decodeObjectForKey("html") as? String; } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(self.name, forKey: "name"); aCoder.encodeObject(self.age, forKey: "age"); aCoder.encodeObject(self.html_url, forKey: "html"); } } 

Y aquí tiene un ejemplo de save y recuperar la matriz de NSUserDefaults:

 let p = Person() p.name = "person1" p.age = "12" p.html_url = "www.google.ro" let p2 = Person() p2.name = "person2" p2.age = "11" p2.html_url = "www.google.ro" let array = [p, p2] let userDefaults = NSUserDefaults.standardUserDefaults() userDefaults.setValue(NSKeyedArchiver.archivedDataWithRootObject(array), forKey: "persons") userDefaults.synchronize() let array : [Person] array = NSKeyedUnarchiver.unarchiveObjectWithData(userDefaults.objectForKey("persons") as! NSData) as! [Person] print("\(array[0].name)\(array[1].name)") 

NSCoding implementar el protocolo NSCoding para almacenar objects personalizados en NSUserDefaults . Mira este ejemplo http://nshipster.com/nscoding/