2014-06-30 10 views
15

मैं इस एक_cmd के बराबर तेज़ क्या है?

[NSExeception raise:NSInternalInconsistencyException format:@"You must override %@ in a subclass", NSStringFromSelector(_cmd)] 

इसके अलावा करने के लिए इसी तरह की एक प्रारूप संदेश में उपयोग करने के लिए वर्तमान पद्धति नाम प्राप्त करना चाहते हैं, मैं _cmd उपयोग करने के लिए जुड़े वस्तु सेट करना चाहते हैं। मैं किसी भी विचार की सराहना करता हूं।

+4

[ '__FUNCTION__'] (https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/swift_programming_language/Expressions.html#//apple_ref/doc/uid/ टीपी 40014097-सीएच 32-एक्सआईडी_691) –

+1

यह प्रश्न डुप्लिकेट कैसे है? –

+0

यह http://stackoverflow.com/questions/24483379/cmd-in-swift-language –

उत्तर

0

_cmd का कोई स्विफ्ट समतुल्य नहीं है। स्विफ्ट में इसका उपयोग करने का कोई कारण नहीं है।

उद्देश्य-सी में _cmd पर विचार करें। यह कब उपयोगी है? अधिकांश समय, _cmd का मान कोड की विधि के नाम के समान होगा, इसलिए यह संकलन समय पर पहले ही ज्ञात है, और रनटाइम मान की कोई आवश्यकता नहीं है। इसके कुछ संभावित मामलों रहे हैं जब _cmd ऑब्जेक्टिव-सी में उपयोगी है:

  • एक मैक्रो में। मैक्रो को कोड में विस्तारित किया गया है, इसलिए यदि _cmd मैक्रो में दिखाई देता है, तो इसे उस स्रोत में डाला जाता है जहां इसका उपयोग किया जाता है, और इसलिए मैक्रो के अंदर विधि का नाम उपयोग किया जा सकता है। हालांकि, स्विफ्ट में ऐसे मैक्रोज़ मौजूद नहीं हैं। प्लस मैक्रोज़ संकलन-समय हैं, इसलिए __FUNCTION__ जैसे संकलन-समय तंत्र समान रूप से काम करेंगे।
  • आप एक सी समारोह है कि self और _cmd लेता है परिभाषित कर सकते हैं, और कई तरीकों के कार्यान्वयन के रूप में यह (एक ही समारोह) का उपयोग करें, class_addMethod और class_replaceMethod, और _cmd समारोह के अंदर का उपयोग कर विभिन्न बीच भेद करने में मदद मिलेगी में जोड़कर विधि कॉल हालांकि, class_addMethod और class_replaceMethod स्विफ्ट में उपलब्ध नहीं हैं।
  • विधि स्विजलिंग एक प्रक्रिया है जो किसी विधि के कार्यान्वयन के साथ गड़बड़ करती है। चूंकि आप दो तरीकों के कार्यान्वयन को स्वैप करते हुए, _cmd कॉल में उपयोग किए गए वास्तविक विधि नाम को प्रकट करने में मदद करेंगे, जो कि स्रोत कोड में कोड की विधि से मेल नहीं खा सकता है, क्योंकि कार्यान्वयन स्वैप किए जाते हैं। मुझे लगता है कि स्विफ्ट में अभी भी संभव हो सकता है, क्योंकि method_exchangeImplementations स्विफ्ट में अभी भी उपलब्ध है। लेकिन विधि में घुमावदार तरीके से, जिस विधि में आप स्वैप करते हैं, वह उस पद्धति के लिए तैयार किया जाता है, जिसके साथ इसे स्वैप किया जा रहा है, इसलिए यदि इसे कहा जाता है, तो कोई अस्पष्टता नहीं है जिसे विधि नाम कहा जा रहा है।
  • उस स्थिति में जहां आप मैन्युअल रूप से IMP (कार्यान्वयन फ़ंक्शन) प्राप्त करते हैं, और मैन्युअल रूप से इसे एक अलग चयनकर्ता के साथ कॉल करें। इस मामले में, फ़ंक्शन के अंदर _cmd में विभिन्न चयनकर्ता देख सकते हैं। हालांकि, आपको स्विफ्ट में इसके बारे में चिंता करने की ज़रूरत नहीं है क्योंकि IMP प्राप्त करने वाली विधियां अनुपलब्ध हैं।
+0

Swizzling के एक dup ढांचे कीड़े के लिए एक अंतिम आपातकालीन समाधान होना चाहिए। ने कहा कि, यहाँ से ** NSHipster ** [स्विफ्ट में swizzling] (http://nshipster.com/swift-objc-runtime/) –

+0

मैं अलग करने के लिए भीख माँगती हूँ स्विफ्ट रन-टाइम बारे में एक पोस्ट है। क्रमबद्ध वर्णनकर्ताओं। मैं एक विधि के एक्सेसर नाम का उपयोग करना पसंद करता हूं, ताकि यदि विशेषता का नाम बदलता है, तो संकलक शिकायत करता है। – horseshoe7

+0

एक तरफ swizzling, एक कारण और अधिक सफाई से एक वैकल्पिक प्रोटोकॉल चयनकर्ता ओवरराइड करने के लिए किया जाएगा। यदि सुपर मैनेजमेंट्स (से: _cmd) एक साफ सुधार होगा। – xtravar

31
NSStringFromSelector(_cmd); // Objective-C 

print(__FUNCTION__) // Swift 2 

print(#function) // Swift 3 
+8

यह स्वीकार्य उत्तर – phlebotinum

+2

"__FUNCTION__" को बहिष्कृत किया जाना चाहिए और स्विफ्ट 3 से हटा दिया जाएगा, इसलिए इसके बजाय उपयोग करें: # फ़ंक्शन –

+2

'__FILE__',' __LINE__', '__COLUMN__' और' __FUNCTION__ जैसे सटीक डीबग पहचानकर्ता होने के लिए 'स्विफ्ट 2.2 ** में' # file', '# line',' # कॉलम 'और '# function' द्वारा प्रतिस्थापित किया गया है। – cherrmanncom

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