美文网首页Swift编程闻道丶iOS(尝鲜版)iOS Developer
Swift 3.0之闭包(Closures)入门和OC bloc

Swift 3.0之闭包(Closures)入门和OC bloc

作者: Double丶K | 来源:发表于2017-08-23 13:30 被阅读149次

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

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

    相关文章

      网友评论

      • 桔子听:4.0都已经出来这么久了,为什么不直接上4.0!
        Double丶K:@桔子听 :smiley: 这么牛,加油💪
        桔子听:@Double丶K 哈哈,我就猜到了,我正在啃英文的,进度很慢,看了快一半了。共勉!
        Double丶K:@桔子听 等中文文档出了再看:fearful:

      本文标题:Swift 3.0之闭包(Closures)入门和OC bloc

      本文链接:https://www.haomeiwen.com/subject/kbfhrxtx.html