2015-10-05 10 views
6

मेरे पास एक कक्षा है जो NSCoder/NSKeyedArchiver और NSKeyedUnarchiver के साथ क्रमबद्ध और deserializes है। मेरे पास यूनिट परीक्षण हैं जो मेरे धारावाहिक प्रारूप के अंदर विभिन्न त्रुटियों के संचालन की जांच के लिए डिज़ाइन किए गए हैं (जो एक साधारण संग्रह नहीं है लेकिन इसमें अभिलेखागार हैं)।NSKeyedUnarchiver unarchiveObjectWithData वापस लौटना

हालांकि, चूंकि मैंने स्विफ्ट 2/आईओएस 9 में अपग्रेड किया है, परीक्षण कुछ असामान्य व्यवहार प्रदर्शित कर रहे हैं। पहले, अमान्य अभिलेखागार के लिए परीक्षण एक अमान्य संग्रह को deserializing के रूप में विफल रहा एक उद्देश्य-सी अपवाद फेंक दिया, दस्तावेज़ राज्य के रूप में, जो प्रोग्राम को दुर्घटनाग्रस्त कर दिया क्योंकि स्विफ्ट उन्हें पकड़ नहीं सकता है। यह ठीक है, मैं भविष्य में किसी बिंदु पर परीक्षण को ठीक करना चाहता था।

अब, परीक्षण पास हो जाता है। जब मेरे यादृच्छिक या निर्धारक कचरे को खिलाया जाता है, तो मुझे अपवाद के बजाय unarchiveObjectWithData से nil वापस प्राप्त होता है। मैंने इस विधि के लिए दस्तावेज़ों की जांच की है और कोई व्यवहार परिवर्तन सूचीबद्ध नहीं है।

सचमुच, मुझे लगता है कि यह व्यवहार बेहद संदिग्ध हो गया है क्योंकि इस बदलाव के बारे में कहीं भी कोई उल्लेख नहीं है या नहीं। मेरे पहले विफल यूनिट परीक्षण अभी किसी भी स्पष्ट कारण से गुजर रहे हैं क्यों।

तो क्या यह नया अपेक्षित व्यवहार है (यह nil देता है)? यदि नहीं, तो मैं अवैध संग्रह के लिए nil की बजाय वास्तविक अपेक्षित व्यवहार (Obj-C अपवाद) कैसे प्राप्त कर सकता हूं?

उत्तर

3

Swift2/iOS9 अप्रलेखित NSKeyedUnarchiver मेंthrows वर्ग विधि का परिचय:

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

लेकिन यह करता है, तो डेटा पूरी तरह से गलत प्रारूप है काम करने के लिए लगता है नहीं है: यह त्रुटि के बिना nil देता है।

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

त्रुटियाँ फेंक दिया जाता है केवल जब Unarchiver कुछ अवैध इकाइयों (उदा अज्ञात वर्ग के नाम) पाया, जबकि डिकोडिंग। मुझे लगता है कि यह एक तरह का बग है या यह गलती से अपूर्ण कार्यान्वयन के साथ जारी किया गया है।

वैसे भी, अगर आप ऑब्जेक्टिव-सी अपवाद चाहते हैं, तो आप सिर्फ NSKeyedUnarchiver निर्माण कर सकते हैं:

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

लेकिन, वहाँ कोई throws प्रारंभकर्ता है ... अभी तक?

+0

इसके लिए धन्यवाद। मुझे लगता है कि मैं NSKeyedArchiver का निर्माण करूंगा और मैन्युअल रूप से उस ओबीजेसी अपवाद को संभाल सकता हूं, ताकि मैं इस अजीब गैर-दस्तावेज वाले आधा-लागू चरण में नहीं हूं। – Puppy

संबंधित मुद्दे