2014-09-02 14 views
11

में एनएसओब्जेक्ट सबक्लास के प्रारंभकर्ता में super.init() को कॉल करना मैं स्विफ्ट में एक आईओएस ऐप बना रहा हूं और Lister नमूना प्रोजेक्ट ऐप्पल प्रदान करता हूं।स्विफ्ट

लिस्टर दो मॉडल ऑब्जेक्ट्स का उपयोग करता है: सूची और सूची Item। मैंने पाया कि उनमें से दोनों अपने प्रारंभिकरण में super.init() पर कॉल नहीं करते हैं, भले ही वे NSObject subclass।

हालांकि, लिस्टर के उद्देश्य-सी संस्करण में, मॉडल ऑब्जेक्ट्स (एएपीएललिस्ट और एएपीएललिस्ट इटिम) दोनों [super init] पर कॉल करते हैं।

स्विफ्ट प्रोग्रामिंग भाषा स्पष्ट रूप से कहा गया है कि "नामित initializers उनके तत्काल सुपर क्लास से एक नामित प्रारंभकर्ता कॉल करना होगा।" (प्रारंभ में प्रारंभकर्ता श्रृंखलन के नियम 1)

यहाँ क्या हो रहा है? यह एक अपवाद क्यों है और यदि आपको हमेशा उपखंड में super.init() पर कॉल नहीं करना चाहिए, तो कौन से नियम लागू होते हैं?

उत्तर

12

भले ही मुझे दस्तावेज में कोई जगह नहीं मिल पाती है, जहां यह वर्णित किया गया है, तो क्या होता है कि डिफ़ॉल्ट सुपरक्लास प्रारंभकर्ता को उपclass प्रारंभकर्ता के अंत में बुलाया जाता है यदि यह सुपरक्लास का एकमात्र प्रारंभिक है, और यह स्पष्ट रूप से नहीं कहा गया था।

NSObject(init()); initialiser डिफ़ॉल्ट आप देख सकते हैं स्वयं एक निर्माता कि super.init(): फोन नहीं करता है में संदर्भित करने के लिए (जैसे। println(self)) प्रयास करके कि सुपर क्लास initialiser उपवर्ग initialiser के अंत में कहा जाता है आप ऐसा करने के लिए अनुमति नहीं है केवल इसकी वजह वर्ग पूरी तरह से उस बिंदु पर initialised नहीं है।

आप निर्माता में कहीं स्वयं का उपयोग करना चाहते हैं, तो वस्तु पूरी तरह से उस बिंदु पर निर्माण किए जाने की आवश्यकता है, तो आप फिर से पहले मैन्युअल super.init() कॉल करने के लिए की जरूरत है।