2014-06-05 10 views
5

क्यों है जब तक स्विफ्ट क्लास NSObject से फैली हुई है, हम इसे उद्देश्य-सी रनटाइम पर पास कर सकते हैं और इसे हमारे लिए आत्मनिरीक्षण करने के लिए कह सकते हैं।स्विफ्ट: क्लास विधि

  • वर्ग
  • classForCoder
  • classForKeyedArchiver

:

हम तीन विकल्प हैं। । हालांकि कक्षा को मारा गया है। (छवि देखें)। ऐसा क्यों है?

enter image description here

उत्तर

7

जैसा कि आप प्रलेखन में देख सकते हैं, यह केवल उद्देश्य सी में उपलब्ध है और तेजी से नहीं। देखें: https://developer.apple.com/documentation/objectivec/nsobject/1571950-class

मुझे लगता है कि इस वजह से AnyObject यदि आपके पास पर्याप्त जानकारी (अधिक NSObject से) उदाहरण के लिए आप NSStringFromClass([BaseObject class]) है कि आप उद्देश्य सी में कर के बजाय तेज में NSStringFromClass(BaseObject) कर सकते हैं

+0

हां, ध्यान दिया कि कक्षा स्वयं एक AnyClass प्रकार है। दिलचस्प बात यह है कि Birdy.classForCoder और Birdy.classForKeyedArchiver रनटाइम पर पारित किया जा सकता है, लेकिन बर्डी स्वयं नहीं। (अगला प्रश्न) –

+0

आप सही थे। मैं एक सबूत खोजने में कामयाब रहा कि आपका जवाब सही है। – Sulthan

8

ऐसा इसलिए है क्योंकि class स्विफ्ट में एक कीवर्ड है, इसलिए किसी भी वैध विधि class नामित नहीं किया जा सकता। उसी तरह आप for, while या अन्य कीवर्ड नामक विधि नहीं बना सकते हैं।

मैं अपने तरीकों से स्ट्राइक-आउट को पुन: उत्पन्न करने में सक्षम नहीं था, हालांकि, obj-c में एक विधि var (या अन्य कीवर्ड) नामकरण करना स्विफ्ट से इसे असंभव बनाता है।

संपादित

मैं गलत था। यह अभी भी

var clazz: AnyClass? = self.`class`() 

का उपयोग कर हालांकि स्विफ्ट से class कॉल करने के लिए संभव है, तो संकलक का कहना है:

'क्लास' अनुपलब्ध है: उपयोग 'dynamicType' के बजाय

तो द्वारा जवाब एडविन वर्मीर्स सही है।

+0

उपयोगी पता करने के लिए देता है , लेकिन वास्तव में यह नहीं समझाता कि कोड-समापन ड्रॉप-डाउन में 'वर्ग()' क्यों दिखाई देता है, अकेले फंस जाएं। –

+0

हां, आप अपनी घोषणा में बैकटिक्स का उपयोग करके 'class',' for', 'while' या अन्य कीवर्ड नामक विधियां बना सकते हैं:' func 'func'() -> शून्य {...}' ' –

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