美文网首页
swift学习之Selector

swift学习之Selector

作者: coderhlt | 来源:发表于2019-01-08 14:07 被阅读13次

    在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修饰,否则编译器是不会通过的。
    
    • 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(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)
       }
    }
    

    相关文章

      网友评论

          本文标题:swift学习之Selector

          本文链接:https://www.haomeiwen.com/subject/giuahqtx.html