फिक्स-यह सही है - ऑब्जेक्टिव-सी के संपर्क में आने वाली विधि को बनाने के लिए आप चयनकर्ता के बारे में कुछ भी नहीं बदल सकते हैं।
पहली बार में इस चेतावनी का पूरा कारण 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 सी को बेनकाब, और इसलिए चयनकर्ताओं के साथ उपयोग करने के लिए अब आवश्यक।