2015-10-05 10 views
6

NSCoder/NSKeyedArchiver ve NSKeyedUnarchiver ile seri hale getirilmiş ve seri hale getirilmiş bir sınıfa sahibim. Seri hale getirme formatımdaki (basit bir arşiv değil, arşiv içeren) çeşitli hataların ele alındığını kontrol etmek için tasarlanmış birim testlerim var. Ancak, Swift 2/iOS 9'a yükselttiğimden beri, testler bazı alışılmadık davranışlar sergiliyor. Önceden, geçersiz arşivlerin sınanması geçersiz bir arşivin serileştirilmesi olarak başarısız oldu, bir Objective-C istisnası, docs durumu gibi, programı Swift'in yakalayamadığı için çöktü. Bu iyi, geleceği bir noktada test etmeyi planladım.NSKeyedUnarchiver unarchiveObjectWithData dönen

Şimdi, sınama geçer. Rastgele veya deterministik çöplerimi beslediğimde, bunun yerine bir istisna yerine dan nil alırım. Bu yöntem için dokümanlar kontrol ettim ve listelenen bir davranış değişikliği yok.

Açıkçası, bu değişikliğin nasıl ve niçin gerçekleştiğine dair herhangi bir yer olmadığı için bu davranış değişikliğinin son derece şüpheli olduğunu görüyorum. Daha önce başarısız olan birim testlerim şimdi neden belli bir sebep olmadan geçiyor.

Bu yeni beklenen davranış (nil döndürüyor) nedir? Değilse, geçersiz bir arşiv için nil yerine gerçek beklenen davranışı nasıl elde edebilirim (Obj-C istisnası)?

cevap

3

Swift2/iOS9 NSKeyedUnarchiver yılında belgesizthrows sınıf yöntemi tanıtır:

extension NSKeyedUnarchiver { 
    @warn_unused_result 
    public class func unarchiveTopLevelObjectWithData(data: NSData) throws -> AnyObject? 
} 

Ama verilerin tamamen yanlış format ise iş gibi görünüyor değildir: O hatasız nil döndürür. kod çözme sırasında unarchiver bazı geçersiz kişiler (örneğin bilinmeyen sınıf adı) bulundu yalnızca

let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)! 
try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(dat) // -> `nil` 

Hatalar atılır. Bence bu bir çeşit hata ya da eksik uygulamalarla kazayla serbest bırakıldı. Henüz ...

let dat = "test".dataUsingEncoding(NSUTF8StringEncoding)! 
let unarchiver = NSKeyedUnarchiver(forReadingWithData: dat) // -> throws Objective-C exception 

Ama, hayır throws başlatıcı vardır:

Neyse sen Objective-C istisna istiyorsanız, sadece NSKeyedUnarchiver inşa edebilir?

+0

Bunun için teşekkürler. Sanırım NSKeyedArchiver'ı yapılandıracağım ve şu anda bu ObjC istisnasını elle halledeceğim, böylece bu tuhaf belgelenmemiş yarı uygulamalı adımda değilim. – Puppy