Swiftselector

swift那神奇的#selector

2017-04-01  本文已影响1056人  hmisty

第一章 神奇

猜猜哪个btnTapped函数会被调用?

import UIKit

class DemoViewController : UIViewController {
    
    override func viewDidLoad() {
        let view = DemoView()
        let btn = view.btn;
        self.view.addSubview(btn!)
    }
    
    @objc func btnTapped(_ sender: UIButton) {
        print("print: surprise!")
    }

}

class DemoView {
    var btn : UIButton!

    init() {
        btn = UIButton()
        btn.frame = CGRect(x: 110, y: 70, width: 100, height: 44)
        btn.backgroundColor = UIColor.blue
        btn.setTitle("Press me", for: .normal)
        btn.setTitle("I'm Pressed", for: .highlighted)
        btn.addTarget(self, action: #selector(DemoView.btnTapped(_:)), for: .touchUpInside)
    }
    
    @objc func btnTapped(_ sender: UIButton) {
        print("print: demo button is tapped")
    }
    
}

答案是:surprise!

第二章 解惑

正确的写法应该用singleton模式来实现DemoView,如下。

import UIKit

class DemoViewController : UIViewController {
    
    override func viewDidLoad() {
        let view = DemoView._instance
        let btn = view.btn;
        self.view.addSubview(btn!)
    }
    
    @objc func btnTapped(_ sender: UIButton) {
        print("print: surprise!")
    }

}

class DemoView {
    var btn : UIButton!

    static let _instance = DemoView()
    
    private init() {
        btn = UIButton()
        btn.frame = CGRect(x: 110, y: 70, width: 100, height: 44)
        btn.backgroundColor = UIColor.blue
        btn.setTitle("Press me", for: .normal)
        btn.setTitle("I'm Pressed", for: .highlighted)
        btn.addTarget(self, action: #selector(DemoView.btnTapped), for: .touchUpInside)
    }
    
    @objc func btnTapped(_ sender: UIButton) {
        print("print: demo button is tapped")
    }
    
}

<b>洞察:</b>

第三章 祛魅

Debug容易成为一门玄学。以下是国内外网友分享的一些“迷信“。

第四章 优雅

通过extension Selector可以写的更加优雅。

import UIKit

class DemoViewController : UIViewController {
    
    override func viewDidLoad() {
        let view = DemoView._instance
        let btn = view.btn;
        self.view.addSubview(btn!)
    }
    
    @objc func btnTapped(_ sender: UIButton) {
        print("print: surprise!")
    }

}

class DemoView {
    var btn : UIButton!

    static let _instance = DemoView()
    
    private init() {
        btn = UIButton()
        btn.frame = CGRect(x: 110, y: 70, width: 100, height: 44)
        btn.backgroundColor = UIColor.blue
        btn.setTitle("Press me", for: .normal)
        btn.setTitle("I'm Pressed", for: .highlighted)
        btn.addTarget(self, action: .btnTapped, for: .touchUpInside)
    }
    
    @objc func btnTapped(_ sender: UIButton) {
        print("print: demo button is tapped")
    }
    
}

private extension Selector {
    static let btnTapped = #selector(DemoView.btnTapped)
}

<b>解读:</b>
action:后面直接用点号的写法是一种糖,compiler看起来就是Selector.btnTapped,也正是最下方的extension代码所实现的。

From painful to painless.

上一篇 下一篇

猜你喜欢

热点阅读