如何在swift中将类实例设置为userdefaults?
我研究过它,但我找不到合适的解决方案。我想将一个类实例设置为userDefaults。假设我有一个这样的类:如何在swift中将类实例设置为userdefaults?
class Person {
var id: Int
var name: String
var email: String
init() {
self.id = 0
self.name = ""
self.email = ""
}
}
我创建从一个人的类的实例,之后Web服务调用完成,我所做的:
var person: Person = Person()
person.id = personJSON.valueForKey(WSConstants.USER_ID) as Int
person.name = personJSON.valueForKey(WSConstants.USER_NAME) as String
person.email = personJSON.valueForKey(WSConstants.USER_EMAIL) as String
,然后,我真的想这样做:
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(person, forKey: "personInfo")
userDefaults.synchronize()
但我这是错的,什么是正确的方式来设置一个类实例userDefaults?
谢谢您的回答,
问候
按NSUserDefaults Class Reference:
的
value
参数可以是唯一的财产清单对象:NSData
,NSString
,NSNumber
,NSDate
,NSArray
,或者NSDictionary
。对于NSArray
和NSDictionary
对象,其内容必须是属性列表对象。
您需要将您的Person
实例序列化为其中一个对象,然后将其保存为用户默认值。
一个很多方法可以做到这一点是实现你的类NSCoding
协议:
class Person: NSCoding {
required init(coder aDecoder: NSCoder) {
self.id = aDecoder.decodeIntegerForKey("id")
self.name = aDecoder.decodeStringForKey("name")
self.email = aDecoder.decodeStringForKey("email")
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeInteger(self.id, forKey: "id")
aCoder.encodeString(self.name, forKey: "name")
aCoder.encodeString(self.email, forKey: "email")
}
}
// when writing your defaults...
let personData = NSKeyedArchiver.archivedDataWithRootObject(person)
userDefaults.setObject(personData, forKey: "personInfo")
// then, when reading your defaults...
let personData = userDefaults.objectForKey("personInfo") as NSData?
if let personData = personData? {
let person = NSKeyedUnarchiver.unarchiveObjectWithData(personData) as Person
}
或者,你可以保存你的personJSON
字典为默认值。
谢谢你正在工作:) – user2174358 2014-08-28 13:35:51
那么,在另一个类中,我将使用另一个userDefaults。但是在那个类中存在另一个类实例。假设在类“A”中存在类B实例。我如何在A类中创建可串行化的类B? – user2174358 2014-08-28 13:39:41
只需使用'encodeObject(nestedObject,forKey:“key”)' – akashivskyy 2014-08-28 14:13:12
'NSUserDefaults'不是通用数据库/持久性存储。为了保存状态,有很多好的选项,比如'NSArchiver'和核心数据等等。 – zaph 2014-08-28 14:05:43