swift学习之Selector

2019-01-08  本文已影响13人  coderhlt

在Objective-c中,@selector作为方法选择器基于runtime的消息机制,在运行时通过发送消息,寻找对应的方法名,找到对应的方法实现。 而Swift是静态语言,是没有@selector的。从swift2.2开始用一个类似始我们使用#selector可以从暴露给OC的代码中,获取一个选择器。

    override func viewDidLoad() {
        super.viewDidLoad()
        let btn = UIButton()
        btn.frame = CGRect(x: 100, y: 100, width: 100, height: 40)
        btn.backgroundColor = UIColor.red
        view.addSubview(btn)
        btn.addTarget(self, action: #selector(ViewController.click), for: .touchUpInside)
    }

Swift 4.0之前:
   func click(){
        print(123456)
    }

func click(){
        print(123456)
    }

 @objc private func click(){
        print("swift3.0 private测试")
    }
函数用private修饰默认只是对swift可见的,而对object-c不可见。而selector是object-c的特性,你需要用@objc去修饰,这样就可以暴漏给object-c了

---------------------------------------------------------------------

Swift 4.0之后:
  @objc func click(){
        print("swift4.0测试")
    }
这样即使不被private修饰,默认所有的swift方法都默认是OC不可见得,这样你必须用@objc修饰,否则编译器是不会通过的。
import UIKit
class ViewController: UIViewController {
   override func viewDidLoad() {
       super.viewDidLoad()
       let btn = UIButton()
       btn.frame = CGRect(x: 100, y: 100, width: 100, height: 40)
       btn.backgroundColor = UIColor.red
       btn.titleLabel?.text = "11111"
       view.addSubview(btn)
       btn.addTarget(self, action: #selector(ViewController.click), for: .touchUpInside)
   }
   @objc private func click(){
 
       print("swift4.2测试")
   }
}

//2.1带参数的监听
class SecondController: UIViewController {
   override func viewDidLoad() {
       super.viewDidLoad()
       let btn = UIButton()
       btn.frame = CGRect(x: 100, y: 100, width: 100, height: 40)
       btn.backgroundColor = UIColor.red
       btn.titleLabel?.text = "11111"
       view.addSubview(btn)
       btn.addTarget(self, action: #selector(click(btn:)), for: .touchUpInside)
   }
   @objc func click(btn:UIButton){
       
       print(btn)
   }

}

//2.2如果方法名字在方法所在域内是唯一的话,我们可以简单的使用方法的名字来作为#selector的内容。
import UIKit
class ViewController: UIViewController {
   override func viewDidLoad() {
       super.viewDidLoad()
       let btn = UIButton()
       btn.frame = CGRect(x: 100, y: 100, width: 100, height: 40)
       btn.backgroundColor = UIColor.red
       btn.titleLabel?.text = "11111"
       view.addSubview(btn)
       btn.addTarget(self, action: #selector(test), for: .touchUpInside)
   }
   @objc func test(btn:UIButton){
       
       print(btn)
   }
}
上一篇下一篇

猜你喜欢

热点阅读