闭包是自包含的函数代码块,可以在代码中被传递和使用.(参考OC中的Block)
一. 定义闭包或者block
1.先声明,在进行定义属性
Swift中使用typealias(起别名)可以来对闭包起别名例如:
//闭包定义: 闭包名字 = (参数)->(返回值)
typealias TYBlock = ()->()//无参无返回值
//定义属性
var tyBlock: TYBlock?
//定义表达式
self.tyBlock = {
print("哈哈哈")
}
//调用
if tyBlock != nil {
tyBlock!()
}
OC中同样:
//Block指针定义:返回值 (^Block名字)(参数列); 如:int (^cube)(int a)
typedef void(^ TYBlock)();//参数是字符串类型,无返回值
//定义属性
@property (nonatomic, strong) TYBlock testBlock;
//Block变量的赋值格式为: Block变量 = ^(参数列表){函数体};
testBlock = ^{
NSLog(@"%@ ", "11111");
};
//调用
aBlock();
2.直接进行定义属性,表达式赋值和调用也是类似的
声明一个无返回值,参数为两个字符串对象
Swift:有参无返回值类型,这些都差不多,重要的是在实际应用中进行应用
//tyBlock:闭包名称.x,y:参数.Void:返回值
var tyBlock:((_ x:String,_ y:String)->Void)?
//小康括号里面是参数,in后面的是返回值,这是无返回值类型,所以进行了打印
self.tyBlock = {(x,y) in
print(x + y)
}
if tyBlock != nil {
tyBlock!("Mr","Kevin")
}
OC中:主要说明闭包blcok只是引用作用,赋值和调用就不在进行展示
void(^tyBlock)(NSString *x, NSString *y);
二. 实际应用
1.场景一自定义View上的点击事件需要穿到控制器中
在View中声明闭包,进行属性定义,然后调用
typealias TYBlock = ()->()
var myBlock: TYBlock?
//xib拖拽的按钮点击方法
@IBAction func testBtnClick(_ sender: Any) {
if myBlock != nil {
myBlock!()
}
}
//控制器中的调用
let testView = TestView.init(frame: CGRect.init(x: 100, y: 400, width: 100, height: 100))
testView.myBlock = {
print("按钮点击")
}
self.view.addSubview(testView)
2.封装网络请求类,使用逃逸闭包在控制器中进行调用闭包获得返回值(模拟)
//在网络请求类中的代码
class func requestData(handel:@escaping(_ reaData:AnyObject) -> Void) {
//请求接口所获取的数组
let reaData = ["1","2","3","4","5"]
handel(reaData as AnyObject)
}
//在控制器中调用
TYNetWork.requestData { (model) in
print(model[2])
}
逃逸闭包的常用用途还有进行网络请求以后加载UI
//控制器中添加代码
func requestData(handel:@escaping(_ reaData:AnyObject) -> Void) {
let reaData = ["1","2","3","4","5"]
handel(reaData as AnyObject)
}
//控制器中进行调用赋值
self.requestData { (arr) in
print(arr[1])
}
水平有限,尾随闭包,值捕获,自动闭包还没有怎么用过.
未完待续