2015-10-13 41 views
1

我有以下課程。當我嘗試將其添加到NSUserDefaults的是這樣的:如何將NSCoding應用到類中?

let testClass = TestClass() 
testClass.Property1 = 22.3 
NSUserDefaults.standardUserDefaults().setObject(testClass, forKey: "object1") 

我得到一個錯誤:

'NSInvalidArgumentException', reason: 'Attempt to insert non-property list object for key object1'

class TestClass: NSObject, NSCoding { 
    var Property1:Double? 

    override init() { 
     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     if let priceCoded = aDecoder.decodeObjectForKey("Property1") as? Double { 
      self.Property1 = priceCoded 
     } 
    } 

    func encodeWithCoder(aCoder: NSCoder){ 
     if let priceEncoded = self.Property1 { 
      aCoder.encodeObject(priceEncoded, forKey: "Property1") 
     } 
    } 
} 

任何想法,我做錯了嗎?

回答

2

Any idea what I'm doing wrong?

是的。不是說明顯而易見,而是「嘗試插入非屬性列表對象」幾乎涵蓋了它。您可以插入到默認系統中的對象種類僅限於屬性列表類型:NSString,NSDate,NSNumber,NSData和集合NSArrayNSDictionary。你顯然試圖插入一些其他類型的對象,從而出現錯誤。

如果您想存儲其他類型的對象,則需要以某種方式將其轉換爲受支持的類型之一。你在正確的軌道上 - 通常的做法是使用NSKeyedArchiver序列化對象,該對象可以存儲採用NSCoding協議的對象。這個想法是,你創建一個密鑰存檔器,用它來序列化有問題的對象,然後獲取一個NSData的實例,然後你可以存儲該實例。要獲取對象,請做相反的操作:使用NSKeyedUnarchiver將數據對象反序列化回原始對象。

它看起來像你期待NSUserDefaults序列化NSCoding符合你的對象,但這並沒有發生 - 你需要自己做。

有很多例子,但尋找這個的通常地方是歸檔和序列化編程指南。具體而言,請查看"Creating and Extracting Archives"部分的示例代碼。這裏是一塊相關的例子的序列化:

NSMutableData *data = [NSMutableData data]; 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:aPerson forKey:ASCPersonKey]; 
[archiver finishEncoding]; 

請記住,爲了將對象序列這種方式,對象必須是採用NSCoding協議的類的實例。同樣的文件解釋瞭如何實施必要的方法,並且在這裏也必須有幾十個關於它的問題。