原因
一般的方法前面是不需要寫@objc的,但selector對(duì)應(yīng)的方法前面必須加,因?yàn)閟elector其實(shí)是 Objective-C runtime 的概念。在 Swift4 中,默認(rèn)情況下所有的 Swift 方法在Objective-C 中都是不可見的,所以你需要在這類方法前面加上@objc關(guān)鍵字,將這個(gè)方法暴露給 Objective-C,才能進(jìn)行使用。
更優(yōu)雅的方式
算是一種取巧的方式吧。用 extension。 把需要加 @objc 的方法。放到對(duì)應(yīng)的 extension 里面。在 extension 外部直接用 @objc。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
perform(#selector(test))
perform(#selector(handleClick))
}
}
@objc
extension ViewController {
func test() -> Bool {
return false
}
func handleClick() {
}
}