在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)
}
}
网友评论