我有一个类,它用NSCoder/NSKeyedArchiver和NSKeyedUnarchiver序列化和反序列化。我有一些单元测试,这些测试旨在检查我对序列化格式中的各种错误的处理情况(这不是一个简单的归档,而是包含归档)。
然而,自从我升级到Swift 2/iOS 9之后,测试显示出了一些不寻常的行为。以前,无效档案的测试失败,因为反序列化无效档案会抛出一个目标-C异常,因为docs状态会使程序崩溃,因为Swift无法捕获它们。这很好,我打算在将来的某个时候修复这个测试。
现在测试通过了。当给我的随机或确定性垃圾喂食时,我反而从unarchiveObjectWithData (而不是一个异常)那里接收回unarchiveObjectWithData。我已经检查了这个方法的文档,没有列出任何行为改变。
坦率地说,我发现这种行为的改变是非常可疑的,因为在任何地方都没有提到这种变化是如何或为什么发生的。我以前失败的单元测试刚刚通过,没有明显的原因。
那么,这是新的预期行为(它返回nil)吗?如果不是,我如何才能获得实际的预期行为(Obj异常)而不是无效存档的nil?
发布于 2015-10-05 11:43:33
Swift2 2/iOS9 9在throws中引入了无文档化的NSKeyedUnarchiver类方法
extension NSKeyedUnarchiver {
@warn_unused_result
public class func unarchiveTopLevelObjectWithData(data: NSData) throws -> AnyObject?
}但是,如果数据格式完全错误,它似乎就无法工作:它返回nil时没有出错。
let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)!
try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dat) // -> `nil`只有当未存档程序在解码时发现一些无效实体(例如,未知类名)时,才会引发错误。我认为这是一种错误,或者是在不完全实现的情况下意外发布的。
无论如何,如果您想要Objective异常,只需构造NSKeyedUnarchiver。
let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)!
let unarchiver = NSKeyedUnarchiver(forReadingWithData: dat) // -> throws Objective-C exception但是,没有throws初始化器.还没?
https://stackoverflow.com/questions/32945068
复制相似问题