如何使用 NSUserDefaults 在 Swift 中存储自定义类数组?
Posted
技术标签:
【中文标题】如何使用 NSUserDefaults 在 Swift 中存储自定义类数组?【英文标题】:How to use NSUserDefaults to store an array of custom classes in Swift? 【发布时间】:2016-07-27 08:37:45 【问题描述】:我有一个名为Person
的自定义类,它在某人输入信息时存储有关某人的各种属性。
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
一旦创建了字典,它就会被放入一个数组中。当点击按钮时,我在将数组保存到 NSUserDefaults
时遇到问题。
personArray.append(newPerson) // newPerson = dictionary of attributes
NSUserDefaults.standardUserDefaults().setObject(personArray, forKey: "personArray")
NSUserDefaults.standardUserDefaults().synchronize()
我看过How to store custom objects in NSUserDefaults 和Saving custom SWIFT class with NSCoding to UserDefaults,但运气不好,很难理解。
当我尝试保存到 NSUserDefaults 时,我被告知以下内容:
Attempt to set a non-property-list object (
"PersonApp.Person"
) as an NSUserDefaults/CFPreferences value for key personArray
谁能帮助我通过 NSUserDefaults 实际保存一组自定义对象(自定义字典)?
【问题讨论】:
Swift 3 但这正是你想要做的***.com/a/37983027/2303865 【参考方案1】:您的 Person 类应如下所示:
斯威夫特 3:
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)")
斯威夫特 4:
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.decodeObject(forKey: "name") as? String;
self.age = aDecoder.decodeObject(forKey: "age") as? String;
self.html_url = aDecoder.decodeObject(forKey: "html") as? String;
func encode(with aCoder: NSCoder)
aCoder.encode(self.name, forKey: "name");
aCoder.encode(self.age, forKey: "age");
aCoder.encode(self.html_url, forKey: "html");
【讨论】:
【参考方案2】:您需要实现NSCoding
协议才能将自定义对象存储到NSUserDefaults
。看看这个例子http://nshipster.com/nscoding/
【讨论】:
【参考方案3】:斯威夫特 4
向您的班级确认可编码协议 使用 JsonEncoder 类序列化(数据)您的对象 现在将您的数据保存到 userDefaults查看此答案以获得清晰的想法 Save Array of Custom Swift object to userDefaults
【讨论】:
以上是关于如何使用 NSUserDefaults 在 Swift 中存储自定义类数组?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 如何使用 NSUserDefaults 保存 NSNumber?
如何使用 NSUserDefaults 将项目添加到 NSMutableArray