2014-08-28 78 views
2

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

谢谢您的回答,

问候

+1

'NSUserDefaults'不是通用数据库/持久性存储。为了保存状态,有很多好的选项,比如'NSArchiver'和核心数据等等。 – zaph 2014-08-28 14:05:43

回答

3

NSUserDefaults Class Reference

value参数可以是唯一的财产清单对象:NSDataNSStringNSNumberNSDateNSArray,或者NSDictionary。对于NSArrayNSDictionary对象,其内容必须是属性列表对象。

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

+0

谢谢你正在工作:) – user2174358 2014-08-28 13:35:51

+1

那么,在另一个类中,我将使用另一个userDefaults。但是在那个类中存在另一个类实例。假设在类“A”中存在类B实例。我如何在A类中创建可串行化的类B? – user2174358 2014-08-28 13:39:41

+1

只需使用'encodeObject(nestedObject,forKey:“key”)' – akashivskyy 2014-08-28 14:13:12

相关问题