Селектор против действия Swift 4

Новое для Swift. У меня есть два фрагмента ниже:

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? Я должен предоставить тег @objc для параметра selector, но не для параметра действия UITapGestureRecognizer?

В чем же разница между selector и Action in Swift?

Ответ 1

Проверьте это предложение для Swift 4: SE-0160 Ограничение вывода @objc

В соответствии с описанием в предложении ваш второй фрагмент кода также нуждается в @objc.

Фактически, компилятор Swift 4 в комплекте с Xcode 9 beta2 генерирует эту ошибку для строки с помощью #selector(tapped):

error: аргумент '#selector' относится к методу экземпляра 'tapped()' который не подвергается Objective-C

note: добавьте '@objc', чтобы открыть этот метод экземпляра Objective-C

Может быть, ваша секунда немного слишком старая, чтобы использовать ее с Swift 4. Вам лучше подумать все методы, вызванные с помощью атрибута @objc, требующего селектор.