2014-08-28 45 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

相關問題