如何使用NSUserDefaults在Swift中存储自定义类的数组?

我有一个名为Person的自定义类,它在input信息时存储有关某人的各种属性。

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

一旦字典被创build,它就被放入一个数组中。 我遇到问题,当点击一个button时,将数组保存到NSUserDefaults

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

我已经看了如何在NSUserDefaults中存储自定义对象,并将 NSCoding的自定义SWIFT类保存到UserDefaults,但我没有运气,发现很难理解。

我当我只是试图保存到NSUserDefaults,我被告知以下内容:

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

任何人都可以帮助我实际上通过NSUserDefaults保存一个自定义对象(自定义字典)的数组?

您的Person类应如下所示:

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

在这里你有一个从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协议来将自定义对象存储到NSUserDefaults 。 看看这个例子http://nshipster.com/nscoding/