2014-09-02 8 views
14

मैं एक ढांचा वर्ग (का विस्तार करना चाहता हूं, मैं स्रोत कोड को सीधे संपादित करना नहीं चाहता), और इसे NSCoding के अनुरूप बना देता हूं।एक्सटेंशन के रूप में एनएससीओडी जोड़ना

मूल रूप से, यहां स्थिति मैं तैयार हूं का सरलीकरण है:?

/* Can't be edited. */ 
class Car: NSObject { 
    var color: String? 
} 

/* Can be edited */ 
extension Car: NSCoding { 
    init(coder aDecoder: NSCoder) { 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
    } 
} 

मुद्दा है init(coder aDecoder: NSCoder) प्रति हेडर फाइल के रूप में, एक designated initializer (हालांकि यह अजीब नहीं है नहीं करना चाहिए यह convenience initializer है?)। हालांकि, documentation का कहना है कि एक्सटेंशन एक नया नामित प्रारंभकर्ता नहीं जोड़ सकता है।

मेरी अंग्रेजी सही नहीं है और शायद मुझे कुछ याद आया ... या यह वास्तव में असंभव है?

उत्तर

10

प्रलेखन की तरह कहते हैं, एक्सटेंशन नए नामित प्रारंभकर्ता नहीं जोड़ सकते हैं। क्या होगा यदि निजी गुण थे जिन्हें प्रारंभिकरण की आवश्यकता है? प्रकार को सही ढंग से प्रारंभ करना असंभव होगा। आप एक विस्तार में सुविधा प्रारंभकर्ता जोड़ सकते हैं क्योंकि उनकी प्रकृति से, उन्हें एक निर्दिष्ट प्रारंभकर्ता को कॉल करना होगा।

इसके अलावा, init (कोडर aDecoder: NSCoder) निर्दिष्ट नामित प्रारंभकर्ता के रूप में निर्दिष्ट है क्योंकि यह एक उदाहरण बनाने के लिए एक अलग रास्ता है। उदाहरण के लिए UIViewController लें, इसे सादे कोड का उपयोग करके बनाया जा सकता है या इसे XIB फ़ाइल से बनाया जा सकता है।

अंत में, एनएससीओडी लागू करने वाले एक्सटेंशन को जोड़ना संभव नहीं है।

शायद आप इस श्रेणी में एक रैपर वर्ग बना सकते हैं और इसे एनएससीओडी लागू कर सकते हैं।

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