Селектор против действия 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
, требующего селектор.