एक और देर से जवाब है, लेकिन इस प्रश्न पर मौजूदा जवाब में से कोई भी वास्तव में ओ पी के सवाल है, जो है का जवाब: क्यों हो तुम एक private
वर्ग के सदस्य पर @objc
का उपयोग करने की आवश्यकता होगी, अगर @objc
Objective- के साथ बातचीत के लिए है सी, और प्रश्न में सदस्य निजी है, जिसका अर्थ है कि यदि आपके पास अपनी परियोजना में उद्देश्य-सी कोड है, तो भी इसे सदस्य को देखने में सक्षम नहीं होना चाहिए?
कारण यह है कि, क्योंकि कई ढांचे उद्देश्य-सी में लिखे गए हैं, कभी-कभी उद्देश्य-सी सुविधाओं को कुछ एपीआई के साथ बातचीत करने की आवश्यकता होती है।
उदाहरण के लिए, मान लीजिए कि मैं DistributedNotificationCenter
माध्यम से एक सूचना के लिए पंजीकृत करना चाहते हैं:
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(somethingHappened(_:)),
name: someNotification,
object: nil)
इसके लिए काम करने के लिए, हम somethingHappened
विधि के लिए चयनकर्ता प्राप्त करने में सक्षम होने की जरूरत है। हालांकि, चयनकर्ता एक उद्देश्य-सी अवधारणा हैं, इसलिए यदि विधि उद्देश्य-सी के लिए दृश्यमान नहीं है, तो इसमें कोई चयनकर्ता नहीं है। इसलिए, यदि विधि निजी है और कोड के बाहर मनमाने ढंग से नहीं कहा जाना चाहिए, तो उसे DistributedNotification
कोड के लिए @objc
की आवश्यकता होगी, जो उद्देश्य-सी में लिखा गया है, ताकि इसे अपने चयनकर्ता के माध्यम से कॉल किया जा सके।
एक और आम मामला जहां @objc
की आवश्यकता है कुंजी-वैल्यू कोडिंग (केवीसी), खासकर मैकोज़ पर, जहां केवीसी और केवीओ को कोको बाइंडिंग को लागू करने के लिए उपयोग किया जाता है। केवीसी, कोको में कई अन्य प्रणालियों की तरह है, उद्देश्य-सी में कार्यान्वित किया गया है, जिसका उद्देश्य केवीसी-अनुरूप गुणों को उद्देश्य-सी रनटाइम के संपर्क में लाने की आवश्यकता है। कभी-कभी, यह केवीसी-अनुरूप गुणों के लिए निजी हो जाता है। एक उदाहरण है जब आप अन्य गुणों को प्रभावित करता है कि एक संपत्ति है:
@objc private dynamic var originalProperty: String
@objc private static let keyPathsForValuesAffectingDependentProperty: Set<String> = [
#keyPath(originalProperty)
]
@objc public var dependentProperty: String { return changeItSomehow(self.originalProperty) }
इस मामले में, हमारी वास्तविक संग्रहीत संपत्ति निजी है, लेकिन निर्भर संपत्ति है, जो हम बाहर कोड को बेनकाब कर , भेजने के लिए की जरूरत है अपने निजी संपत्ति अद्यतन होने पर अधिसूचनाएं। निजी संपत्ति को @objc
के रूप में चिह्नित करके, हम आसानी से केवीसी निर्भरता स्थापित करके ऐसा कर सकते हैं-अन्यथा, हमें निजी संपत्ति के willSet
और didSet
हैंडलर में मैन्युअल रूप से अधिसूचनाएं भेजने के लिए कोड लिखना होगा। इसके अलावा, स्थिर संपत्ति जो केवीसी सिस्टम को सूचित करती है कि dependentProperty
originalProperty
पर निर्भर है उद्देश्य-सी के संपर्क में आने की आवश्यकता है ताकि केवीसी सिस्टम और इसे ढूंढें और इसे कॉल करें, लेकिन यह हमारे कोड के ग्राहकों के लिए प्रासंगिक नहीं है।
इसके अलावा, एक मैकोज़ ऐप में एक व्यू कंट्रोलर जो कोको बाइंडिंग का उपयोग करके अपने दृश्य में नियंत्रण को अद्यतन करता है, कार्यान्वयन विस्तार के रूप में कुछ निजी गुणों को केवीसी-अनुपालन को उन नियंत्रणों को बांधने के लिए कर सकता है।
तो जैसा कि आप देखते हैं, ऐसे समय होते हैं जब ढांचे के साथ बातचीत करने के लिए किसी विधि या संपत्ति को उद्देश्य-सी के संपर्क में आने की आवश्यकता हो सकती है, बिना आपके कोड के ग्राहकों को दिखाई देने की आवश्यकता होती है।
इसलिए '@objc निजी func doubleTapGestureRecognized' के लिए, @objc और निजी दोनों के लिए क्या बिंदु है? क्या आप कह रहे हैं उद्देश्य-सी कक्षाएं DoubleTapGestureRecognized को ओवरराइट कर सकती हैं? – Wingzero
मुझे लगता है, क्योंकि obj-c में आप किसी भी विधि को ओवरराइट कर सकते हैं। – strangetimes