如何在swift中将类实例设置为userdefaults?

时间:2014-08-28 12:41:54

标签: iphone ios7 swift

我研究过它,但我找不到合适的解决方案。我想将一个类实例设置为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的正确方法是什么?

感谢您的回答,

祝你好运

1 个答案:

答案 0 :(得分:3)

根据NSUserDefaults Class Reference

  

value参数只能是属性列表对象:NSDataNSStringNSNumberNSDateNSArray或{{ 1}}。对于NSDictionaryNSArray个对象,其内容必须是属性列表对象。

您需要将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 } 字典保存为默认值。