2017-06-30 14 views
12

स्विफ्ट के लिए नया। मैं नीचे दो स्निपेट है:चयनकर्ता बनाम एक्शन स्विफ्ट 4

NotificationCenter.default.addObserver(self, 
    selector:#selector(ViewController.notificationReceived), 
    name: Notification.Name(rawValue: name), object: nil) 

@objc func notificationReceived(notification:Notification){ 
    let x = notification.userInfo! 
    print("\(x["name"]!)") 

} 

और अंत में

let x:UITapGestureRecognizer = UITapGestureRecognizer(target: self, 
    action: #selector(tapped)) 

self.addGestureRecognizer(x) 

func tapped(){ 
    print("tapped") 

    self.delegate!.theViewTapped() 

} 

ऐसा क्यों है कि notificationCenter के लिए है? मुझे selector पैरामीटर के लिए @objc टैग प्रदान करना है, लेकिन UITapGestureRecognizer कार्रवाई पैरामीटर के लिए नहीं?

Selector और Action in स्विफ्ट के बीच क्या अंतर है?

+0

तुलना करें [मैं कैसे स्विफ्ट 4 में #selector() के साथ @objc अनुमान प्रतिवाद के साथ सौदा कर सकते हैं?] (Https://stackoverflow.com/q/44390378/2976878) - के रूप में Ooper कहते हैं, दोनों उदाहरण की आवश्यकता होती है 'objc' होने का लक्ष्य तरीका। – Hamish

उत्तर

9

चेक स्विफ्ट 4 के लिए इस प्रस्ताव: SE-0160 Limiting @objc inference

प्रस्ताव में वर्णन के अनुसार, अपने दूसरे कोड स्निपेट भी @objc की जरूरत है।

error: argument of '#selector' refers to instance method 'tapped()' that is not exposed to Objective-C

note: add '@objc' to expose this instance method to Objective-C

हो सकता है कि अपने दूसरे एक छोटे से बहुत पुराना स्विफ्ट 4. साथ उपयोग करने के लिए बेहतर होगा कि तुम लगता है सा है:

वास्तव में, स्विफ्ट 4 संकलक साथ Xcode 9 beta2 बंडल #selector(tapped) का उपयोग कर लाइन के लिए इस त्रुटि उत्पन्न करता है चयनकर्ता के माध्यम से लागू सभी विधियों की आवश्यकता @objc विशेषता है।

संबंधित मुद्दे