2016-11-24 7 views
22

@objc बनाम गतिशील के रूप में विधि को चिह्नित करने के बीच क्या अंतर है, आप एक बनाम दूसरे के साथ कब करेंगे?स्विफ्ट 3 - गतिशील बनाम @objc

नीचे गतिशील के लिए ऐप्पल की परिभाषा है।

गतिशील इस वर्ग को किसी वर्ग के किसी भी सदस्य को लागू करें जो उद्देश्य-सी द्वारा दर्शाया जा सकता है। जब आप गतिशील संशोधक के साथ सदस्य घोषणा को चिह्नित करते हैं, तो उस सदस्य तक पहुंच हमेशा गतिशील रूप से उद्देश्य-सी रनटाइम का उपयोग करके प्रेषित होती है। उस सदस्य तक पहुंच संकलक द्वारा कभी भी रेखांकित या devirtualized नहीं है।

चूंकि प्रभावी संशोधक के साथ चिह्नित घोषणाओं भेज दिया जाता है ऑब्जेक्टिव-सी क्रम का उपयोग कर, वे परोक्ष ObjC विशेषता के साथ चिह्नित कर रहे हैं।

+0

क्या आपके प्रश्न का उत्तर दिया गया है? – Alexander

उत्तर

26

@objc के रूप में घोषित एक फ़ंक्शन/वैरिएबल उद्देश्य-सी से सुलभ है, लेकिन स्विफ्ट स्थिर या वर्चुअल प्रेषण के माध्यम से सीधे इसे एक्सेस करना जारी रखेगा। इसका अर्थ यह है कि यदि कार्य/चर उद्देश्य-सी ढांचे के माध्यम से घुमाया जाता है, जैसे कक्षाओं को संशोधित करने के लिए कुंजी-मूल्य निरीक्षण या विभिन्न उद्देश्य-सी एपीआई का उपयोग करते समय क्या होता है, तो स्विफ्ट और ऑब्जेक्टिव-सी से विधि को कॉल करने से अलग-अलग परिणाम मिलेंगे ।

dynamic का उपयोग स्विफ्ट को हमेशा उद्देश्य-सी गतिशील प्रेषण का संदर्भ देने के लिए कहता है। यह कुंजी-मूल्य की तरह चीजों के लिए आवश्यक है जो सही ढंग से काम करने के लिए देख रहे हैं। जब स्विफ्ट फ़ंक्शन कहा जाता है, तो यह कॉल को गतिशील रूप से प्रेषित करने के लिए उद्देश्य-सी रनटाइम को संदर्भित करता है।

+0

मुझे नहीं पता था कि केवीओ को घुमाया जा रहा है, क्या आप इस बिंदु पर विस्तार कर सकते हैं? – Boon

+2

@ बून केवीओ एक गतिशील उप-वर्ग बनाता है, जो आपकी संपत्ति को बदले में बदलता है, जो चेंज वैल्यूफोरके/डेंचेंजवैल्यूफोर्की कॉल में लपेटा जाता है, जब तक स्वचालित रूप से नोटिब्यूट्स ऑब्सर्वरफोरकी को ऑप्ट-आउट करने के लिए उपयोग नहीं किया जाता है। – kevin

6

कि बोली कहते हैं, dynamic@objc निकलता है।

जब तक आप dynamic के रूप में कक्षा निर्दिष्ट नहीं करते हैं, तो संकलक दूर ऑप्टिमाइज़ करने और इसकी विधियों को रेखांकित करने के लिए स्वतंत्र है। यह बड़े प्रदर्शन लाभ लाता है, लेकिन इसका मतलब है कि आप रन टाइम पर उन विधि कार्यान्वयन को नहीं बदल सकते हैं। यदि आप उद्देश्य सी रनटाइम की प्रतिबिंब क्षमताओं का उपयोग करके रनटाइम पर उन विधियों के साथ गड़बड़ करने की योजना बना रहे हैं, तो आपको dynamic का उपयोग करना होगा। आपको एक प्रदर्शन जुर्माना लगेगा (आपका कोड सी-जैसे स्तरों की बजाय गति के उद्देश्य सी स्तर पर चलाएगा), लेकिन आप उस अतिरिक्त गतिशीलता को प्राप्त करेंगे।