点击事件 

//
// ViewController.swift
// DemoApp
//
// Created by liuan on 2020/4/23.
// Copyright © 2020 anguo.com. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view
//定义一个整形常量,作为按钮的宽度,该宽度的值为当前屏幕的宽度和40的差
let width=Int(self.view.frame.size.width-40)
let greetingButton=UIButton(frame: CGRect(x: 20, y: 100, width: width, height: 40))
greetingButton.setTitle("Greeting", for: .normal)
greetingButton.backgroundColor = .orange
//第一种设置点击事件
// greetingButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
greetingButton.tag=1
let antherMethod:Selector=#selector(buttonTappedFor(_:))
greetingButton.addTarget(self, action: antherMethod, for: .touchUpInside)
self.view.addSubview(greetingButton)

}
@objc func buttonTapped(){
print("buttonTapped")
}
@objc func buttonTappedFor(_ sender:UIButton)

{
let tag=sender.tag
print("Button tag :\(tag)")
}

}

消息使用、

//
// ViewController.swift
// DemoApp
//
// Created by liuan on 2020/4/23.
// Copyright © 2020 anguo.com. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

override func viewDidLoad()
{
super.viewDidLoad()
// Do any additional setup after loading the view
//定义一个整形常量,作为按钮的宽度,该宽度的值为当前屏幕的宽度和40的差
//消息的传递机制。通过定时器
let timerSelector=#selector(timerAction(_:))
Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: timerSelector, userInfo: "parameter", repeats: true)
//选择器在子线程中的使用
let newSelector=#selector(timerAction2)
//子线程中调用选择器
self.perform(newSelector,with: nil,afterDelay: 2.0)
//主线程调用
self.perform(newSelector,on:.main,with: nil,waitUntilDone: true)
}

@objc func timerAction(_ timer :Timer){
let parameter=timer.userInfo
print(parameter ?? "")
}

@objc func timerAction2(){
print("timerAction2")
}
}