2015-12-08 41 views
0

我試圖解開一個實現NSCoding協議的自定義對象。此類稱爲Reservation及其財產之一是斯威夫特詞典:EXC_BAD_INSTRUCTION當解壓縮Swift詞典

class Reservation { 
    //... 
    var orderedExtras : [CarExtra : Int]? 
} 

CarExtra也實現NSCoding。 現在,當我嘗試使用

NSKeyedArchiver.archiveRootObject(reservations, toFile: ArchiveURL.path!) 

一切正常將文件寫入到磁盤。但是,從磁盤讀取此對象時遇到問題。 當我試着使用

required convenience init?(coder aDecoder: NSCoder) { 
     let extras = aDecoder.decodeObjectForKey("orderedExtras") as? [CarExtra : Int] 
} 

它給了我一個

EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子碼=爲0x0)

例外取消歸檔的對象。如果我嘗試,而不是治療未存檔的對象作爲一個NSDictionary

let extras = aDecoder.decodeObjectForKey("orderedExtras") as? NSDictionary 

它不會崩潰,我可以提取我已經保存的數據。 有人可以解釋爲什麼我得到這個錯誤信息? Of可以簡單地在整個應用程序中使用NSDictionary,但我寧願繼續使用Swift類型。

編輯:這裏是堆棧跟蹤 stack trace

+1

怎麼樣? NSDictionary爲? [CarExtra:Int] 能完成這項工作嗎? – Amir

+2

您會在EXC_BAD_INSTRUCTION上提供堆棧跟蹤嗎? – Amir

+0

我更新了問題。不幸的是, NSDictionary爲? [CarExtra:Int]也不起作用。 – slashburn

回答

1

我終於得到它。

存檔和解除存檔機制正常工作。問題是我試圖歸檔[CarExtra: Int]?類型的對象。所以我試圖存檔一個可選。如果您然後試圖將它轉換爲[CarExtra : Int](注意失蹤?)你會得到一個

EXC_BAD_INSTRUCTION(代碼= EXC_I386_INVOP,子碼=爲0x0)

錯誤。

因此,解決方案是通過簡單地解開它來歸檔不是可選的Swift Dictionary。確保字典不是零。爲此,您可以使用??運營商

func encodeWithCoder(aCoder: NSCoder) { 

    //make sure that the dictionary is not nil before 
    aCoder.encodeObject(self.orderedExtras!, forKey: "orderedExtras") 

} 

注意!編碼對象時。 然後,您可以將其轉換回字典。

required convenience init?(coder aDecoder: NSCoder) { 
     let extras = aDecoder.decodeObjectForKey("orderedExtras") as? [CarExtra : Int] 
}