2015-12-08 92 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] 
}