2017-06-30 27 views
12

Nowość w Swift. Mam dwa fragmenty poniżej:Selektor kontra działanie Swift 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"]!)") 

} 

i wreszcie

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

self.addGestureRecognizer(x) 

func tapped(){ 
    print("tapped") 

    self.delegate!.theViewTapped() 

} 

Dlaczego jest to, że dla notificationCenter? Mam podać tag @objc dla parametru selector, ale nie dla parametru akcji UITapGestureRecognizer?

Jaka jest dokładnie różnica między Selector i Action in Swift?

+0

Porównaj [Jak radzić sobie z wycofaniem zapytania @objc za pomocą #selector() w Swift 4?] (Https://stackoverflow.com/q/44390378/2976878) - jak mówi OOPer, oba przykłady wymagają docelową metodą jest '@ objc'. – Hamish

Odpowiedz

9

Sprawdź to propozycja dla Swift 4: SE-0160 Limiting @objc inference

Zgodnie z opisem we wniosku, drugi fragment kodu wymaga również @objc.

W rzeczywistości Swift 4 kompilator pakiecie z Xcode 9 beta2 generuje ten błąd dla linii używając #selector(tapped):

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

Może twój drugi jest trochę zbyt stary, aby skorzystać z Swift 4. Lepiej myśleć wszystkie metody wywoływane przez atrybut selector need @objc.