鍍金池/ 問答/iOS/ 在 swift 生命周期中綁定的函數(shù),聲明時(shí)候怎么不用寫 @objc

在 swift 生命周期中綁定的函數(shù),聲明時(shí)候怎么不用寫 @objc

當(dāng)定義一個(gè) UIButton 組件時(shí)候,為其綁定點(diǎn)擊事件

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)
}

聲明這個(gè) handleClick 函數(shù)時(shí)候這樣寫

func handleClick(){
    // do something
}

這樣就會(huì)報(bào)錯(cuò)

圖片描述

我知道在函數(shù)前面加一個(gè) @objc 就行了,但是好丑,我想知道有沒有別的處理方法,可以不用在聲明函數(shù)時(shí)候?qū)?@objc

求路過的大神幫幫忙

回答
編輯回答
拼未來

一般的方法前面是不需要寫@objc的,但selector對(duì)應(yīng)的方法前面必須加,因?yàn)?code>selector其實(shí)是 Objective-C runtime 的概念。在 Swift4 中,默認(rèn)情況下所有的 Swift 方法在Objective-C 中都是不可見的,所以你需要在這類方法前面加上@objc關(guān)鍵字,將這個(gè)方法暴露給 Objective-C,才能進(jìn)行使用。
其實(shí)這是@objc的其中一種作用,其他作用你可以再查下資料。

2018年2月16日 22:42
編輯回答
苦妄

你是在做函數(shù)庫嗎?如果你的函數(shù)庫要為其他OC程序調(diào)用的話,必須有這個(gè)@objc。

2017年2月4日 12:04
編輯回答
拽很帥

算是一種取巧的方式吧。用 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()  {
        
    }
}

2017年9月17日 20:34