Pup*_*ppy 7 nskeyedarchiver ios swift ios9 swift2
我有一个用NSCoder/ NSKeyedArchiver和序列化和反序列化的类NSKeyedUnarchiver.我有单元测试,旨在检查我处理序列化格式中的各种错误(这不是一个简单的存档,但包含存档).
但是,自从我升级到Swift 2/iOS 9后,测试显示出一些不寻常的行为.以前,无效归档的测试失败,因为反序列化无效归档引发了一个Objective-C异常,正如文档声明的那样,由于Swift无法捕获它们而导致程序崩溃.这很好,我打算在将来的某个时候修复测试.
现在,测试通过.当送给我的随机或确定性垃圾,我反而收到nil来自背部unarchiveObjectWithData,而不是例外.我已经检查了这个方法的文档,并且没有列出任何行为更改.
坦率地说,我发现这种行为变得非常可疑,因为没有提到这种变化是如何或为何发生的.我之前失败的单元测试刚刚过去,没有明显的原因.
这是新的预期行为(它返回nil)?如果没有,我如何获得实际的预期行为(Obj-C异常)而不是nil无效的归档?
Swift2/iOS9 中引入了未记录的 throws类方法NSKeyedUnarchiver:
extension NSKeyedUnarchiver {
@warn_unused_result
public class func unarchiveTopLevelObjectWithData(data: NSData) throws -> AnyObject?
}
Run Code Online (Sandbox Code Playgroud)
但如果数据的格式完全错误,它似乎不起作用:它会nil毫无错误地返回。
let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)!
try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dat) // -> `nil`
Run Code Online (Sandbox Code Playgroud)
仅当解档器在解码时发现一些无效实体(例如未知的类名)时才会抛出错误。我认为这是一种错误,或者是由于实现不完整而意外发布的。
不管怎样,如果你想要 Objective-C 异常,你可以构造NSKeyedUnarchiver:
let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)!
let unarchiver = NSKeyedUnarchiver(forReadingWithData: dat) // -> throws Objective-C exception
Run Code Online (Sandbox Code Playgroud)
但是,还没有throws初始化程序吗?
| 归档时间: |
|
| 查看次数: |
3577 次 |
| 最近记录: |