我研究过它,但我找不到合适的解决方案。我想将一个类实例设置为userDefaults。假设我有这样一个类:
class Person {
var id: Int
var name: String
var email: String
init() {
self.id = 0
self.name = ""
self.email = ""
}
}
在WebService调用结束后我从person类创建了一个实例,我做了:
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的正确方法是什么?
感谢您的回答,
祝你好运
答案 0 :(得分:3)
根据NSUserDefaults Class Reference:
value
参数只能是属性列表对象:NSData
,NSString
,NSNumber
,NSDate
,NSArray
或{{ 1}}。对于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
}
字典保存为默认值。