Swift 3.0之闭包(Closures)入门和OC block对比理解

闭包是自包含的函数代码块,可以在代码中被传递和使用.(参考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])
        }

水平有限,尾随闭包,值捕获,自动闭包还没有怎么用过.
未完待续

你可能感兴趣的:(Swift 3.0之闭包(Closures)入门和OC block对比理解)