在 swift 生命周期中绑定的函数,声明时候怎么不用写 @objc

0 0 ios swift
星夜小筑
星夜小筑

声望值:155 0人

2019-01-18 15:19:09 提问

关注 0关注

收藏 0收藏, 134浏览

当定义一个 UIButton 组件时候,为其绑定点击事件

override func viewDidLoad() {
    super.viewDidLoad()
    let btn = UIButton(type: .system)
    btn.frame = CGRect(x: 0, y: 0, width: 275, height: 40)
    self.view.addSubview(btn)
    btn.setTitle("Go", for: UIControlState.normal)
    btn.addTarget(self, action: #selector(handleClick), for: UIControlEvents.touchUpInside)
}

声明这个 handleClick 函数时候这样写

func handleClick(){
    // do something
}

这样就会报错

图片描述

我知道在函数前面加一个 @objc 就行了,但是好丑,我想知道有没有别的处理方法,可以不用在声明函数时候写 @objc

求路过的大神帮帮忙

请先 登录 后评论

3个回答

  • ERP↘CC195声望 2018-09-25 09:29

    你是在做函数库吗?如果你的函数库要为其他OC程序调用的话,必须有这个@objc。
    请先 登录 后评论
  • 风中孤狼128声望 2018-09-25 09:30

    算是一种取巧的方式吧。用 extension。 把需要加 @objc 的方法。放到对应的 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() { } }
    请先 登录 后评论
  • 梦っ未忘174声望 2018-10-15 16:01

    一般的方法前面是不需要写@objc的,但selector对应的方法前面必须加,因为selector其实是 Objective-C runtime 的概念。在 Swift4 中,默认情况下所有的 Swift 方法在Objective-C 中都是不可见的,所以你需要在这类方法前面加上@objc关键字,将这个方法暴露给 Objective-C,才能进行使用。其实这是@objc的其中一种作用,其他作用你可以再查下资料。
    请先 登录 后评论

注册新账号

悬赏追问
10
  • 10
  • 20
  • 50
  • 100
  • 200
  • 输入数值
发布追问