फिक्स-यह सही है - ऑब्जेक्टिव-सी के संपर्क में आने वाली विधि को बनाने के लिए आप चयनकर्ता के बारे में कुछ भी नहीं बदल सकते हैं।
पहली बार में इस चेतावनी का पूरा कारण SE-0160 का परिणाम है । स्विफ्ट 4 से पहले, internal
या NSObject
विरासत वाले वर्गों के उच्च उद्देश्य-सी संगत सदस्य होने का अनुमान लगा रहे थे @objc
और इसलिए ऑब्जेक्टिव-सी के संपर्क में थे, इसलिए उन्हें चयनकर्ताओं का उपयोग करने के लिए बुलाया जा सकता था (विधि के रूप में देखने के लिए ओब्ज-सी रनटाइम आवश्यक है। किसी दिए गए चयनकर्ता के लिए कार्यान्वयन)।
हालाँकि स्विफ्ट 4 में, अब ऐसा नहीं है। केवल बहुत विशिष्ट घोषणाओं का अनुमान लगाया जा सकता है @objc
, उदाहरण के लिए, @objc
तरीकों की ओवरराइड , @objc
प्रोटोकॉल आवश्यकताओं के कार्यान्वयन और उन विशेषताओं के साथ घोषणाएं जो @objc
इस तरह की हैं @IBOutlet
।
इसके पीछे की प्रेरणा, जैसा कि ऊपर दिए गए प्रस्ताव में बताया गया है , सबसे पहले NSObject
समान चयनकर्ताओं के कारण विरासत की कक्षाओं को एक-दूसरे से टकराने से रोकने में विधि अधिभार को रोकने के लिए है। दूसरे, यह द्विआधारी आकार को कम करने में मदद करता है ताकि सदस्यों के लिए थ्रॉक्स उत्पन्न न हो जो ओब्ज-सी के संपर्क में न हो, और तीसरा गतिशील लिंकिंग की गति में सुधार करता है।
यदि आप ओब्ज-सी के लिए एक सदस्य को उजागर करना चाहते हैं, तो आपको इसे @objc
उदाहरण के लिए चिह्नित करना होगा :
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button.addTarget(self, action: #selector(foo), for: .touchUpInside)
}
@objc func foo() {
// ...
}
}
(माइग्रेटर को आपके लिए चयनित चयनकर्ताओं के साथ स्वचालित रूप से ऐसा करना चाहिए जब "चयनित अनुमान" विकल्प के साथ चल रहा हो)
ओबज-सी के सदस्यों के एक समूह को बेनकाब करने के लिए, आप एक का उपयोग कर सकते हैं @objc extension
:
@objc extension ViewController {
// both exposed to Obj-C
func foo() {}
func bar() {}
}
यह ओबज-सी में परिभाषित किए गए सभी सदस्यों को उजागर करेगा, और ओब्ज-सी (जब तक स्पष्ट रूप से चिह्नित नहीं किया जाएगा) को उजागर नहीं किया जा सकता है @nonobjc
।
यदि आपके पास एक वर्ग है जहाँ आपको ओब्ज-सी के लिए सभी ओब्ज-सी संगत सदस्यों की आवश्यकता है, तो आप क्लास को इस प्रकार चिन्हित कर सकते हैं @objcMembers
:
@objcMembers
class ViewController: UIViewController {
// ...
}
अब, सभी सदस्य होने का अनुमान लगाया जा @objc
सकता है। हालाँकि, मैं ऐसा करने की सलाह नहीं दूंगा जब तक कि आपको वास्तव में ओबज-सी के संपर्क में आने वाले सभी सदस्यों की आवश्यकता न हो , उपरोक्त सदस्यों द्वारा अनावश्यक रूप से उजागर किए गए उल्लिखित को देखते हुए।
@objc
है , ताकि उन्हें Obj सी को बेनकाब, और इसलिए चयनकर्ताओं के साथ उपयोग करने के लिए अब आवश्यक।