在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

當定義一個 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

求路過的大神幫幫忙

回答
編輯回答
拼未來

一般的方法前面是不需要寫@objc的,但selector對應的方法前面必須加,因為selector其實是 Objective-C runtime 的概念。在 Swift4 中,默認情況下所有的 Swift 方法在Objective-C 中都是不可見的,所以你需要在這類方法前面加上@objc關鍵字,將這個方法暴露給 Objective-C,才能進行使用。
其實這是@objc的其中一種作用,其他作用你可以再查下資料。

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

你是在做函數庫嗎?如果你的函數庫要為其他OC程序調用的話,必須有這個@objc。

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

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

2017年9月17日 20:34