第一步 定义闭包
typealias swiftBlock = (_ str: String) -> Void
第二步 声明
var callBack : swiftBlock? //第二步 声明
第三步 实现闭包
func callBackBlock(_ block: @escaping swiftBlock) { // 第三步 实现闭包
callBack = block
}
第四步 触发闭包
if callBack != nil { // 第四步 触发闭包
callBack!("闭包传值")
}
第五步 触发闭包回调
cusVC.callBackBlock { (str) in //第五步 触发闭包回调
print(str)
}
测试
1、Swift:闭包Closure
FirstViewController.swift
import UIKit
/**
* 1、 声明一个闭包别名,闭包含字符串类型的两个参数,无返回值(使用“()”或者“Void”都一样)
*/
typealias SwiftClosure = (name:String,age:Int) -> Void
class FirstViewController: UIViewController {
override funcviewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor =UIColor.whiteColor()
//创建push按钮let button
= UIButton.init(frame: CGRectMake(200, 200, 100, 100))
button.setTitle("Push", forState: .Normal)
button.center = self.view.center
button.backgroundColor = UIColor.greenColor()
button.setTitleColor(UIColor.redColor(), forState: .Normal)
button.addTarget(self, action: #selector(PushSecondViewController), forControlEvents: .TouchUpInside)
self.view.addSubview(button)
}
/**
* 2、定义闭包属性,可选类型
*/varcallBackClosure = SwiftClosure?()
/**
* 3、 闭包触发调用后,对闭包属性赋值,同时提供调用外部访问闭包中数值的接口
*/
func callBackClosureFunction(closure:SwiftClosure){
callBackClosure = closure
}
/**
* 4、定义触发闭包调用的方法,此时需要将要传递的参数存入闭包中
* 此处我将参数固定死了,开发中根据需要自己可以将需要的数值当做方法的参数,其实就是给方法添加参数即可,由外部决定参数值
* 例如: func TriggerClosure(name:String,age:Int) -> Void { }
*/
func TriggerClosure(){
ifcallBackClosure != nil {
callBackClosure!(name:"夏远全",age:26)
}
}
/**
* Push第二个控制器入栈
*/
func PushSecondViewController() -> Void {
self.navigationController?.pushViewController(SecondViewController(), animated:true)
}
}
SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
/**
* 5、创建第一个控制器实例
*/
let firstVC = FirstViewController()
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.purpleColor()
/**
* 6、接收闭包触发后回传的数值并打印
*/
firstVC.callBackClosureFunction { (name, age) in
print("name:\(name), age:\(age)")
}
}
/**
* 点击屏幕触发闭包
*/ override func touchesBegan(touches: Set, withEvent event: UIEvent?) {
firstVC.TriggerClosure()
}
}