एक और देर से जवाब, लेकिन इस सवाल पर मौजूदा जवाबों में से कोई भी वास्तव में ओपी के सवाल का जवाब नहीं देता है, जो है: क्यों बिल्ली को आपको कक्षा सदस्य @objc
पर उपयोग करने की आवश्यकता होगी private
, यदि @objc
उद्देश्य-सी के साथ बातचीत के लिए है, और प्रश्न में सदस्य है। निजी है, जिसका अर्थ है कि भले ही आपके प्रोजेक्ट में ऑब्जेक्टिव-सी कोड हो, फिर भी इसे सदस्य को देखने में सक्षम नहीं होना चाहिए?
इसका कारण यह है, क्योंकि कई फ्रेमवर्क ऑब्जेक्टिव-सी में लिखे जाते हैं, कभी-कभी ऑब्जेक्टिव-सी फीचर्स के लिए दूसरे एपीआई के साथ इंटरैक्ट करने की जरूरत होती है।
उदाहरण के लिए, मान लीजिए कि मैं एक अधिसूचना के माध्यम से पंजीकरण करना चाहता हूं DistributedNotificationCenter
:
DistributedNotificationCenter.default.addObserver(self,
selector: #selector(somethingHappened(_:)),
name: someNotification,
object: nil)
इस काम के लिए, हमें somethingHappened
विधि के लिए चयनकर्ता प्राप्त करने में सक्षम होना चाहिए । हालाँकि, चयनकर्ता एक उद्देश्य-सी अवधारणा हैं, इसलिए यदि विधि उद्देश्य-सी के लिए दृश्यमान नहीं है, तो इसका चयनकर्ता नहीं है। इसलिए, भले ही विधि निजी हो और उसे बाहर के कोड द्वारा मनमाने ढंग से नहीं बुलाया जाना चाहिए, उसे कोड @objc
के लिए एक क्रम की आवश्यकता होगी DistributedNotification
, जो कि ऑब्जेक्टिव-सी में लिखा गया है, इसे अपने चयनकर्ता के माध्यम से कॉल करने में सक्षम होने के लिए।
एक और आम मामला जहां @objc
की-वैल्यू कोडिंग (केवीसी) का समर्थन करने की आवश्यकता है, विशेष रूप से मैकओएस पर, जहां केओवी और केवीओ को कोको बिंदिंग्स को लागू करने के लिए उपयोग किया जाता है। केवीसी, कोको में कई अन्य प्रणालियों की तरह है, जो उद्देश्य-सी में लागू किया गया है, जिसमें केवीसी-अनुपालन गुणों की आवश्यकता का प्रभाव उद्देश्य-सी रनटाइम के संपर्क में है। कभी-कभी, यह KVC के अनुरूप गुणों को निजी बनाने के लिए समझ में आता है। एक उदाहरण है जब आपके पास एक संपत्ति है जो अन्य गुणों को प्रभावित करती है:
@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
, हम आसानी से KVC निर्भरता स्थापित करके ऐसा कर सकते हैं- अन्यथा, हमें निजी संपत्ति willSet
और didSet
हैंडलर में सूचनाओं को मैन्युअल रूप से भेजने के लिए कोड लिखना होगा । इसके अलावा, स्थैतिक गुण जो KVC सिस्टम को सूचित करता है जो कि Objective-C के संपर्क में आने की आवश्यकता dependentProperty
पर निर्भर करता originalProperty
है ताकि KVC प्रणाली और इसे खोजे और इसे कॉल करे, लेकिन यह हमारे कोड के ग्राहकों के लिए प्रासंगिक नहीं है।
इसके अलावा, एक मैकओएस ऐप में एक व्यू कंट्रोलर जो कि कोको बिन्डिंग्स को एक कार्यान्वयन विवरण के रूप में उपयोग करते हुए अपने विचार में नियंत्रण को अद्यतन करता है, उन नियंत्रणों को बांधने के लिए कुछ निजी गुण KVC- अनुरूप हो सकता है।
तो जैसा कि आप देखते हैं, ऐसे समय होते हैं जब किसी पद्धति या संपत्ति को आपके कोड के ग्राहकों को दिखाई देने की आवश्यकता के बिना, फ्रेमवर्क के साथ बातचीत करने के लिए ऑब्जेक्टिव-सी के संपर्क में आने की आवश्यकता हो सकती है।